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

Crashed worker never resolves promises

Open Julusian opened this issue 2 years ago • 3 comments

I have a simple case where if a child terminates, that is never reported back to the application in a way that can be handled.

test-child.ts

import { expose } from 'threads/worker'

expose({
	async doit(): Promise<void> {
		console.log('thread: hello!')
		process.exit(1)
	},
})

run.ts

import { spawn, Thread, Worker } from 'threads'

void (async () => {
	const thread1 = await spawn(new Worker('./test-child'))

	setInterval(() => {
		console.log('master: tick')
	}, 1000)

	Thread.events(thread1).subscribe((event) => console.log('Thread event:', event))

	try {
		console.log('master: before')

		await thread1.doit()
	} catch (e) {
		console.log('master: it errored', e)
	}

	console.log('master: we are done')
	await Thread.terminate(thread1)
})()

Note: the code is written in typescript, but it is being compiled to js before executing, so this shouldnt be something ts-node specific.

The output of this ends up being:

  threads:master:spawn Initializing new thread +0ms
  threads:master:messages Message from worker before finishing initialization: { type: 'init', exposed: { type: 'module', methods: [ 'doit' ] } } +0ms
master: before
  threads:master:messages Sending command to run function to worker: { type: 'run', uid: 1, method: 'doit', args: [] } +0ms
thread: hello!
master: tick
master: tick

If I remove the setInterval, then it instead immediately terminates, so the worker_thread is definitely terminating.

I would expect a line master: it errored to be logged as the call failed, and probably a Thread event: too so that the dead worker can be restarted

Julusian avatar Jul 16 '21 10:07 Julusian

Hey @Julusian!

On what platform are you: Browser, node.js, electron? It is almost impossible to have a solution for this issue that reliably works across all of these platforms, but maybe it's good enough for now if we can fix it for your specific use case.

andywer avatar Jul 16 '21 21:07 andywer

This is nodejs 14

Julusian avatar Jul 16 '21 22:07 Julusian

Let's check if subscribing to workers' exit event does the job…

andywer avatar Jul 18 '21 09:07 andywer