如题,
我有一个服务 生成文件的服务,开辟子进程去处理的,
当并发数量特别高的时候 会报错
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掉的进程。
个人观点,欢迎讨论