CNode

nodejs子进程执行脚本的问题

问答
Hhylin发布于12 年前最后回复12 年前3 回复8207 浏览0 收藏

一个比较奇怪的问题 我用 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个左右,程序就停在那里了,没有任何报错异常。 查看进程 子进程还在 QQ截图20141105110220.jpg 我如果在命令行 直接跑这个脚本 /usr/bin/nodejs ./controllers/run-task.js 5459803aa123c7080669e7c2 true 则一切正常,所有150个文件都导出完成了。 child_process.fork有什么限制么?还是我用的不对? 补充: 如果在文件比较少时,比如20个。调用child_process.fork来跑任务时可以完成的。

查看回复

回复 (3)

H
hylin#1·12 年前

额,知道哪的问题,{silent:true}参数引起的。去掉之后就好了。 不过根本原因还是不懂。。。

H
hylin#2·12 年前

查询了很多资料,终于搞明白了 原因是slient=true时,子进程的stdout,stdin,stderr都会pipe到父进程,当子进程的stdout(我的例子里就是日志输出)超过了缓冲区大小,子进程就会暂停,直到缓冲区的stdout数据被读走。 而我只是创建了子进程执行脚本,就没有管它了。所以会出现导出到一定数量的文件(本质是日志输出到一定大小)就停那里了。

A
abruzzihraig#3·12 年前

学习了!

参与回复
登录后即可参与回复。登录