Wasmtime: re-entrant/cooperative wasm?

Created on 26 Nov 2019  路  5Comments  路  Source: bytecodealliance/wasmtime

Hello, apologies for asking this as an issue, but I'm not sure where else to ask questions of this nature.

Is it possible to deschedule and re-schedule running wasm tasks? I'd like to run dozens or hundreds of wasm programs in an app server of sorts, but running each in its own thread seems a tad excessive.

Is it possible to hand to running wasm code functions which are effectively async, and deschedule the wasm program while it is waiting on IO?

Most helpful comment

These are very similar requirements to the ones we built Lucet for (https://github.com/bytecodealliance/lucet). We run WebAssembly code on a separate stack, and we have a yield API which is only accessible to host code called by WebAssembly code and returns back to the host stack, and a resume API to switch back to a suspended instance.

Our goal with Lucet is to merge it with Wasmtime by porting in all of the features that Wasmtime currently lacks, and this is one of the big ones.

We also want to transform the wasi-common (which lives in this repo) to take advantage of this, and perform all IO in an async rust function, for integration with tokio and friends. That work is still in its infancy, we're still working out other aspects of that story.

All 5 comments

These are very similar requirements to the ones we built Lucet for (https://github.com/bytecodealliance/lucet). We run WebAssembly code on a separate stack, and we have a yield API which is only accessible to host code called by WebAssembly code and returns back to the host stack, and a resume API to switch back to a suspended instance.

Our goal with Lucet is to merge it with Wasmtime by porting in all of the features that Wasmtime currently lacks, and this is one of the big ones.

We also want to transform the wasi-common (which lives in this repo) to take advantage of this, and perform all IO in an async rust function, for integration with tokio and friends. That work is still in its infancy, we're still working out other aspects of that story.

So I'm not totally sure what exactly is wanted from this issue, but I've just published the wasmtime-async crate that probably handles this problem -- though not yet handling wasi, due to limitations in the API, though hopefully these will be fixed soon-ish with https://github.com/bytecodealliance/wasmtime/pull/1600.

If so, I've opened https://github.com/bytecodealliance/wasmtime/issues/1672 for suggesting inclusion and/or referring to it from wasmtime's docs, to see what happens :)

@Ekleog url is missing the /crates path: wasmtime-async. Also, nicely done!

@Ekleog - This is fantastic!
I will get started with it today.

I've opened https://github.com/bytecodealliance/rfcs/pull/2 for what it might look like supporting this in wasmtime itself, curious to hear what others think!

Was this page helpful?
0 / 5 - 0 ratings