一个比较奇怪的问题
我用
child_process.fork('./controllers/run-task.js',[results.saveTask._id.toString(),true],{silent:true});
来跑一个任务。run-task里面主要是调用svn命令(用了svn-interface模块)去export文件到本地,然后进行一些处理。run-task使用async.eachLimit来控制export的并发,目前是5个。
我发现任务比较多的时候比如有150个文件需要export时,通常只export到85个左右,程序就停在那里了,没有任何报错异常。
查看进程 子进程还在
我如果在命令行 直接跑这个脚本
/usr/bin/nodejs ./controllers/run-task.js 5459803aa123c7080669e7c2 true
则一切正常,所有150个文件都导出完成了。
child_process.fork有什么限制么?还是我用的不对?
补充:
如果在文件比较少时,比如20个。调用child_process.fork来跑任务时可以完成的。
额,知道哪的问题,{silent:true}参数引起的。去掉之后就好了。 不过根本原因还是不懂。。。
查询了很多资料,终于搞明白了 原因是slient=true时,子进程的stdout,stdin,stderr都会pipe到父进程,当子进程的stdout(我的例子里就是日志输出)超过了缓冲区大小,子进程就会暂停,直到缓冲区的stdout数据被读走。 而我只是创建了子进程执行脚本,就没有管它了。所以会出现导出到一定数量的文件(本质是日志输出到一定大小)就停那里了。
学习了!