【问题标题】:node.js multithreading with max child count具有最大子数的 node.js 多线程
【发布时间】: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


【解决方案1】:

在 cmets 中的对话之后,以下是如何让 Node 执行您的 PHP 脚本。

由于您调用的是外部命令,因此无需创建新线程。 Node.js 的运行循环理解对外部命令的调用是异步操作,它可以同时执行所有这些操作。

您可以看到执行外部进程in this SO question 的不同方式(链接的答案可能是您的最佳选择)。

但是,由于您已经将所有内容移至 Node,您甚至可以考虑将“process.php”脚本重写为 Node.js 代码。正如您所解释的,由于该脚本连接到远程服务器和数据库并使用 nslookup(与 Node.js 一起使用 you may not really need),因此您不需要任何单独的线程:它们都是 Node.js 擅长的异步操作在表演中。

【讨论】:

  • 好的,谢谢,我会尽力做到的。虽然不接受答案。
猜你喜欢
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2015-11-30
  • 2020-02-07
  • 1970-01-01
  • 2021-08-30
相关资源
最近更新 更多