Observable values not being returned until the process finishes
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?
I think the while loop could in theory be blocking the execution, what happens if you run it without the blocking loop?
You can try add a setTimeout 0 to the blocking code to move it to next event loop
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...