javascript – PhantomJS使用太多线程

前端之家收集整理的这篇文章主要介绍了javascript – PhantomJS使用太多线程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个PhantomJS应用程序来抓取我构建的网站并检查要包含的 JavaScript文件. JavaScript类似于Google,其中一些内联代码加载到另一个JS文件中.该应用程序查找其他JS文件,这就是我使用Phantom的原因.

预期的结果是什么?

控制台输出应读取大量URL,然后判断脚本是否已加载.

真的发生了什么?

控制台输出将按预期读取大约50个请求,然后才开始吐出此错误

2013-02-21T10:01:23 [FATAL] QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe
QEventDispatcherUNIXPrivate(): Unable to create thread pipe: Too many open files

这是打开页面搜索脚本的代码块,包括

page.open(url,function (status) {
    console.log(YELLOW,url,status,CLEAR);
    var found =  page.evaluate(function () {
      if (document.querySelectorAll("script[src='***']").length) {
        return true;
      } else { return false; }
    });

    if (found) {
      console.log(GREEN,'JavaScript found on',CLEAR);
    } else {
      console.log(RED,'JavaScript not found on',CLEAR);
    }
    self.crawledURLs[url] = true;
    self.crawlURLs(self.getAllLinks(page),depth-1);
  });

crawledURLs对象只是我已经抓取过的url对象. crawlURLs函数只是通过getAllLinks函数链接,并在具有搜寻器启动的域的基本域的所有链接调用open函数.

编辑

修改代码的最后一个块如下,但仍然有相同的问题.我已将page.close()添加到该文件中.

if (!found) {
  console.log(RED,CLEAR);
}
self.crawledURLs[url] = true;
var links = self.getAllLinks(page);
page.close();
self.crawlURLs(links,depth-1);

解决方法

从文档:

Due to some technical limitations,the web page object might not be completely garbage collected. This is often encountered when the same object is used over and over again.

解决方案是在适当的时间显式调用网页对象的close()(即在许多情况下为页面).

一些包含的示例(例如follow.js)演示了具有显式关闭的多个页面对象.

猜你在找的JavaScript相关文章