我目前正在嘗試找到一種方法來結束從某個主執行緒產生的所有作業執行緒,這些作業執行緒中的任何一個都完成了。我看過各種方案的作業執行緒(如之間的溝通cluster.worker.send(),process.send()等等),但他們都不作業。
到目前為止,我的代碼非常簡單:
const cluster = require('cluster')
const os = require('os')
if ( cluster.isMaster ) {
let children = []
for ( let i = 0; i < os.cpus().length; i ) {
children.push(cluster.fork())
}
process.on('message', (msg) => {
if ( msg.cmd === 'shutdown' ) {
console.log('shutting down')
children.forEach(child => {
child.kill()
})
}
})
} else {
console.log('I am worker #' cluster.worker.id)
let time = Date.now()
while ( Date.now() < time cluster.worker.id * 1000 ) {
// do nothing for some time
}
console.log('I am worker #' cluster.worker.id ' and I am done')
process.send({cmd: 'shutdown'})
}
第一部分使用cluster模塊為每個 CPU 創建一個子行程。接下來,主行程期望來自任何作業人員的某種關閉訊息。每個作業人員運行一些行程,并在一定時間后向主執行緒發送關閉訊息。此時,主執行緒應該觸發所有其他執行緒關閉,但永遠不會收到訊息。這似乎是問題所在,但我無法找到發送此訊息的方法。
當代碼運行時,每個行程都會發送一條“我完成了”訊息,但執行緒不會被殺死。
uj5u.com熱心網友回復:
有幾件事你需要改變:
- 使用
cluster.on代替process.on,就像process.on子行程一樣,而不是父行程。 - 使用
child.process.kill()而不是child.kill().
const cluster = require('cluster')
const os = require('os')
if ( cluster.isMaster ) {
let children = []
for ( let i = 0; i < os.cpus().length; i ) {
children.push(cluster.fork())
}
cluster.on('message', (worker, msg) => {
if (msg.command = 'shutdown') {
// Kill every cluster worker
children.forEach(child => {
child.process.kill()
})
}
})
} else {
console.log('I am worker #' cluster.worker.id)
let time = Date.now()
while ( Date.now() < time cluster.worker.id * 1000 ) {
// do nothing for some time
}
console.log('I am worker #' cluster.worker.id ' and I am done')
process.send({command: 'shutdown'})
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417322.html
標籤:
上一篇:使用串列時Dart隔離非常慢
