andywer / andywer/threads.js

Crashed worker never resolves promises

未关闭
#386 3 条评论 0 个 reaction 已指派 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 摘要。