andywer / andywer/threads.js

Crashed worker never resolves promises

オープン
#386 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
TypeScript
スター
3.5k
フォーク
173
PR マージ指標
30日以内にマージされた PR はありません

説明

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
```typescript
import { expose } from 'threads/worker'

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

run.ts
```typescript
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

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。