Node.js Phantomjs在来自nodejs的多个调用上崩溃

Node.js Phantomjs在来自nodejs的多个调用上崩溃,node.js,phantomjs,Node.js,Phantomjs,我正在开发一个项目,在这个项目中,我需要从nodejs派生/执行多个进程来调用大约50-100个phantomjs,这应该很容易处理。 以下是我遵循的步骤: 1.nodejs(无限循环),总是运行以检查条件,如果条件满足,则 nodejs生成或执行一个新进程来调用phantomjs 虽然我在完成幻影任务后退出(phantom.exit()),但如果我从nodejs执行太多进程(比如说100个),在大多数幻影js进程的输出中,我会使幻影js崩溃 这是因为太多的进程吗?但我认为50-100个并不太多

我正在开发一个项目,在这个项目中,我需要从nodejs派生/执行多个进程来调用大约50-100个phantomjs,这应该很容易处理。 以下是我遵循的步骤:

1.nodejs(无限循环),总是运行以检查条件,如果条件满足,则

  • nodejs生成或执行一个新进程来调用phantomjs
  • 虽然我在完成幻影任务后退出(phantom.exit()),但如果我从nodejs执行太多进程(比如说100个),在大多数幻影js进程的输出中,我会使幻影js崩溃

    这是因为太多的进程吗?但我认为50-100个并不太多,我认为这样一个广泛使用的框架(phantomjs)必须能够处理至少500个请求

    如果我在某个地方出了问题,或者遗漏了什么,请帮助我

    我目前正在使用exec tp calll phantom

    child = execFile(binPath, args, function (error, stdout, stderr) { ---my code here---- });
    
    phantomjs文件太长,我想这就足够我退出它们了:

        setTimeout(function() {
            phantom.exit();
        }, 0);
    

    提前感谢:)

    消耗的内存是进程数量和每个进程使用的内存的函数。我认为运行的子进程越多,内存泄漏的影响就越大

    Phantomjs存在已知的内存泄漏。这可能是你的问题

    加载大约50页后,再次执行PhantomJS子进程

    您可以通过输入命令行参数来传递重新开始所需的信息


    消耗的内存是进程数量和每个进程使用的内存的函数。我认为运行的子进程越多,内存泄漏的影响就越大

    Phantomjs存在已知的内存泄漏。这可能是你的问题

    加载大约50页后,再次执行PhantomJS子进程

    您可以通过输入命令行参数来传递重新开始所需的信息


    这是我为解决这个问题所做的事情, 我一次只执行30个请求,并将其余的请求保留在一个队列中,对于前30个请求,我将计数器从0增加到30,然后当一个请求完成时,将每个请求的计数器减少1。 我保留了一个requestQueue,在这里我不断地将每个请求放在如下位置:

    var requestQueue = {}
    var counter = 0;
    requestQueue.push(--anyreq--);
    
        setInterval(function() { // check frequently if there is a space to send more request to phantom
    
        if(counter < 30 && requestQueue.length > 0 ){
                counter++;   //increement the counter while sending spawning req for phantom
    
                var reqforPhantom = requestQueue.shift(); 
    
        //spawn or exec a req for phantomjs sending 'reqforPhantom' (this is something you want to send to phantom script, if you don't want to send anything you could remove request queue from this code) variable
        //decrement the counter on response
                  counter--;
        }
        },100);
    
    var requestQueue={}
    var计数器=0;
    push(--anyreq--);
    setInterval(function(){//经常检查是否有空间向phantom发送更多请求
    if(计数器<30&&requestQueue.length>0){
    计数器+++;//在为幻影发送生成请求时增加计数器
    var reqforPhantom=requestQueue.shift();
    //为phantomjs发送“reqforPhantom”(这是您要发送到phantom脚本的内容,如果您不想发送任何内容,可以从此代码中删除请求队列)变量生成或执行req
    //响应时减小计数器的值
    计数器--;
    }
    },100);
    
    这是我为解决它所做的事情, 我一次只执行30个请求,并将其余的请求保留在一个队列中,对于前30个请求,我将计数器从0增加到30,然后当一个请求完成时,将每个请求的计数器减少1。 我保留了一个requestQueue,在这里我不断地将每个请求放在如下位置:

    var requestQueue = {}
    var counter = 0;
    requestQueue.push(--anyreq--);
    
        setInterval(function() { // check frequently if there is a space to send more request to phantom
    
        if(counter < 30 && requestQueue.length > 0 ){
                counter++;   //increement the counter while sending spawning req for phantom
    
                var reqforPhantom = requestQueue.shift(); 
    
        //spawn or exec a req for phantomjs sending 'reqforPhantom' (this is something you want to send to phantom script, if you don't want to send anything you could remove request queue from this code) variable
        //decrement the counter on response
                  counter--;
        }
        },100);
    
    var requestQueue={}
    var计数器=0;
    push(--anyreq--);
    setInterval(function(){//经常检查是否有空间向phantom发送更多请求
    if(计数器<30&&requestQueue.length>0){
    计数器+++;//在为幻影发送生成请求时增加计数器
    var reqforPhantom=requestQueue.shift();
    //为phantomjs发送“reqforPhantom”(这是您要发送到phantom脚本的内容,如果您不想发送任何内容,可以从此代码中删除请求队列)变量生成或执行req
    //响应时减小计数器的值
    计数器--;
    }
    },100);
    
    在崩溃状态下你是什么意思?您是否有任何崩溃日志或一些关于崩溃的消息?
    localStorage
    在多个PhantomJS进程中共享,因为它总是写入磁盘。可能对
    localStorage
    数据库有一个锁定限制,它会使PhantomJS崩溃。Hi@alexey它有时会说PhantomJS崩溃,并给出日志文件路径,我无法读取,有时进程会在两者之间停止,并出现fail.Hi@ArtjomB。我对它很陌生,对它了解不多,我会搜索它,但如果你能告诉我,如果它设置为“有限”,我该如何更改它,我将非常感激。崩溃是什么意思?您是否有任何崩溃日志或一些关于崩溃的消息?
    localStorage
    在多个PhantomJS进程中共享,因为它总是写入磁盘。可能对
    localStorage
    数据库有一个锁定限制,它会使PhantomJS崩溃。Hi@alexey它有时会说PhantomJS崩溃,并给出日志文件路径,我无法读取,有时进程会在两者之间停止,并出现fail.Hi@ArtjomB。我对它很陌生,对它不太了解,我会搜索它,但如果你能告诉我如果它设置为“有限”,我该如何更改它,我将非常感激。嗨@therewillbecode,我已经在一个接一个地进行exec,1之后的第2页加载是一个新的exec,因此是一个新流程,你的意思是说我应该等到前50分钟才能完成吗?顺便说一句,提供的链接最后说使用phantom2.0可以解决这个问题,我已经在使用phantom2.0了。虽然我没有尝试使用“-load images=true”,但我不知道它会有什么区别,但我一定会尝试,非常感谢您的快速回复,我的意思是不要让单个进程运行太长时间。因此,如果单个任务的长度超过50个分页,则将其分解为多个执行进程。让我知道这是否清楚。嗨,谢谢,但我不清楚。如何打破phantomjs进程,例如-如果我需要在fb上发布状态,我需要登录,然后发布状态,这可以在sin中完成