首页 > nodejs 子进程数量的控制

nodejs 子进程数量的控制

如题,
我有一个服务 生成文件的服务,开辟子进程去处理的,
当并发数量特别高的时候 会报错

Error: channel closed
    at process.target.send (internal/child_process.js:510:16)
    at IncomingMessage.<anonymous> (/work/www/willclass/routes/tools/esources.js:60:14)
    at emitNone (events.js:72:20)
    at IncomingMessage.emit (events.js:166:7)
    at endReadableNT (_stream_readable.js:913:12)
    at nextTickCallbackWith2Args (node.js:442:9)
    at process._tickCallback (node.js:356:17)

求大神帮忙 如何控制 子进程的数量


我想问一下,一般服务器开多少子进程比较合适?
我曾经爬数据一次开了二十几个进程,然后服务器就会陷入卡死状态,并且挤掉了mysql的进程。


主要问题是因为当主进程关闭的时候子进程没有正确关闭。

两种情况

1. Cluster
2. Child_process

1. 对于第一种情况 - Cluster

获取目前fork的进程数量(没有kill掉的):

cluster.worker 

但是看官方文档可知,Cluster其实也是机遇child_process实现的。
所以我们重点讨论Child_process

2. 对于第二种情况 - Child_process

主进程退出是有一个回掉事件的,你有没有在回调事件里去kill掉已经
fork的子进程。我原来尝试过主进程是没办法kill掉处于内核态(系统
调用都会导致进程进入内核态)的子进程,例如子进程正在读取一个文件
还没有完成的时候主进程退出或是kill掉子进程的时候都会失败,内核态
的进程会忽略SIGKILL信号。

解决思路

个人观点,建议要在逻辑里写子进程数量的的控制,如果子进程被kill掉
的话,计数器减一。正常退出程序前应该确保kill掉了所有的子进程计数器
等于0。对于强行kill掉master进程的情况,我觉得最好在再次启动master
前应该用脚本处理下现有进程中有没有上一次没有被kill掉的进程。

个人观点,欢迎讨论

【热门文章】
【热门文章】