threads.js icon indicating copy to clipboard operation
threads.js copied to clipboard

Observable values not being returned until the process finishes

Open jjv360 opened this issue 2 years ago • 3 comments

Hi, I'm trying to train a neural network with brain.js in a thread (using Node v20, I tried v18 as well), and I can't seem to get updates from the Observable until the entire thread has finished it's work... I've reproduced the issue in the simplest form here:

// main.js
import { spawn, Worker, Thread } from 'threads'

(async function() {
    let worker = await spawn(new Worker("./worker.js"))
    worker.longRunningCode().subscribe(progress => console.log(progress))
})()
// worker.js
import { expose } from "threads/worker"
import { Observable } from "observable-fns"

expose({
    longRunningCode() {
        return new Observable(observer => {
            observer.next("Started")
            for (let i = 0 ; i < 5 ; i++) {
                observer.next("Progress " + i)
                let startedAt = Date.now()
                while (Date.now() - startedAt < 1000) { /* long running code */ }
            }
            observer.next("Completed")
            observer.complete()
        })
    }
})

I would expect to see Progress 0, Progress 1 etc appearing 1 second apart in the console log. Instead, nothing happens for 5 seconds and then I get all the logs at once at the end...

I'm not sure if I'm doing something wrong, or if this is a bug?

jjv360 avatar Jun 18 '23 01:06 jjv360

I think the while loop could in theory be blocking the execution, what happens if you run it without the blocking loop?

balbatross avatar Jun 21 '23 19:06 balbatross

You can try add a setTimeout 0 to the blocking code to move it to next event loop

linonetwo avatar Jul 17 '23 08:07 linonetwo

Hi, this is no longer an issue for me, it happens on Windows WSL2, but doesn't happen on Windows directly or on my Mac, not sure why...

jjv360 avatar Jul 17 '23 08:07 jjv360