node.js - nodejs 子进程数量的控制
高洛峰
高洛峰 2017-04-17 14:33:22
[Node.js讨论组]

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

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)

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
天蓬老师

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

两种情况

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掉的进程。

个人观点,欢迎讨论

巴扎黑

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号