task-worklet icon indicating copy to clipboard operation
task-worklet copied to clipboard

Long running tasks

Open matthewp opened this issue 7 years ago • 1 comments

The postTask API is request/response based, and as such doesn't have a natural fit for long running tasks. How do you see such tasks fitting into the model?

For example, let's say I had a worklet which connects to a chat service (via http2 or websocket) and receives chat messages. Currently you could poll the worklet for the next message like so:

const queue = new TaskQueue();

async function run() {
  await queue.addModule('/chat-worklet.js');

  while(true) {
    const task = queue.postTask('nextMessage');
    const message = await task.result;
    addChatMessageToList(message);
  }
}

run();

I guess this is ok but it also doesn't seem ideal to me. I think it would make the worklet side more complex in a lot of cases (you might have to keep some global state to know which messages have been sent to which requester).

It would be nice if tasks could also return a stream or something, so that you could use for/of to await each message.

matthewp avatar Nov 21 '18 14:11 matthewp

Breaking request/response unfortunately makes task chaining impossible. We (will) have Transferable Streams soon, but the use-cases for this are probably better-suited to a typical Dedicated Worker. Thinking about pooling mainly - I can't see a way to pass a stream through a Task without that Task then locking its parent thread (which would mean all results would be transferred between threads).

In general, Task Worklet is suited to parallelizing main-thread-coordinated work, whereas Worker is suited to offloading arbitrary work.

developit avatar Nov 21 '18 14:11 developit