【发布时间】:2014-12-19 03:26:24
【问题描述】:
我需要编写一个脚本,它采用一个值数组和多线程方式(分叉?)运行另一个脚本,其中一个来自数组的值作为参数,但是会设置最大运行分叉,所以它会等待如果已经有超过 n 个运行,脚本将完成。我该怎么做?
有一个名为 child_process 的插件,但不确定如何完成它,因为它总是等待子终止。
基本上,在 PHP 中它会是这样的(从头开始写,可能包含一些语法错误):
<php
declare(ticks = 1);
$data = file('data.txt');
$max=20;
$child=0;
function sig_handler($signo) {
global $child;
switch ($signo) {
case SIGCHLD:
$child -= 1;
}
}
pcntl_signal(SIGCHLD, "sig_handler");
foreach($data as $dataline){
$dataline = trim($dataline);
while($child >= $max){
sleep(1);
}
$child++;
$pid=pcntl_fork();
if($pid){
// SOMETHING WENT WRONG? NEVER HAPPENS!
}else{
exec("php processdata.php \"$dataline\"");
exit;
}//fork
}
while($child != 0){
sleep(1);
}
?>
【问题讨论】:
-
抱歉这个问题,但每次有人在 Node.js 中请求多线程的东西时都必须这样做:您确定需要在单独的线程上执行此操作吗?即使没有多线程,Node.js 在执行并行操作方面也非常快。除非您需要在不访问任何 i/o 缓冲区的情况下进行大量计算,否则您可能不需要多个线程。
-
如果您的“processdata”脚本执行与数据库、文件或远程服务器交互的操作,那么在 Node 中您可能不需要将其分叉到另一个线程。
-
老实说,我真的不需要它是多线程的,只要它是一样的......所以它可能在回调......但它必须是单独的脚本正在被调用。没有硬编码。
-
目前“processdata”在您的 PHP 代码中做了什么?
-
目前,它连接到几个服务器,收集信息并将其写入
mongodb。它也执行一些unix命令(例如nslookup)......我也需要将它重写为node.js,但这不是问题所在:)
标签: node.js