PhantomJS 没有终止网络服务器客户端连接
PhantomJS not killing webserver client connections
我在 WebServer 模块上有一种代理服务器 运行ning,我注意到该服务器由于内存消耗而被终止。
服务器每次收到新请求时都会创建一个子客户端进程,我看到的问题是该进程会无限期地保持活动状态。
这是我正在使用的服务器:
我以为 response.close()
正在关闭并终止客户端连接,但事实并非如此。
这是 htop 上显示的子进程列表:
(那些过程就更多了,只是列表的一个片段)
我真的需要终止那些进程,因为它们正在使用所有可用内存。我错过了什么吗?
我可以简单地重启服务器,但内存仍然会被浪费。
谢谢!
编辑:
我之前提到的进程都是线程,并没有像我想的那样是独立的进程(check this)。
每个 http 请求都会创建一个新线程,这没问题,但是这个线程不会在脚本结束后被杀死。
此外,我发现如果请求处理程序不 运行 casper(我的意思是 casper.run(..)),则不会创建新线程。
因此,仅当服务器 运行 是 casper 实例时才会创建新线程,问题是此实例不会在 运行 函数结束后结束。
我试过 casper.done()
如下所述,但它杀死了整个进程而不是当前的 运行ning 线程。 (我没有找到此功能的任何文档)。
当我在同一台机器的服务器外执行其他casper脚本时,实例化线程和整个幻影进程成功结束。会发生什么?
我使用的是 Phantom 2.1.1 和 Casper 1.1.1 版本。
如果您想了解更多或具体信息,请问我。
再次感谢阅读!
这是一个众所周知的 casper 问题:
https://github.com/casperjs/casperjs/issues/1355
它还没有被 casper 的家伙修复,目前被标记为增强。我想这不在他们的优先列表中。
无论如何,解决方法是编写服务器端组件,例如一个 node.js 服务器来处理传入的请求,并为每个请求 运行 一个 casper 脚本来在新的子进程中进行抓取。当 casper 终止它的工作时,这个子进程将被关闭。虽然这是一种解决方法,但它并不是最佳解决方案,因为为每个请求打开子进程的成本并不便宜。很难大规模扩展与此类似的方法。但是,这是一个足够的解决方法。有关此完全明智的方法的更多信息,请参阅上面的 link。
我在 WebServer 模块上有一种代理服务器 运行ning,我注意到该服务器由于内存消耗而被终止。
服务器每次收到新请求时都会创建一个子客户端进程,我看到的问题是该进程会无限期地保持活动状态。
这是我正在使用的服务器:
我以为 response.close()
正在关闭并终止客户端连接,但事实并非如此。
这是 htop 上显示的子进程列表:
(那些过程就更多了,只是列表的一个片段)
我真的需要终止那些进程,因为它们正在使用所有可用内存。我错过了什么吗?
我可以简单地重启服务器,但内存仍然会被浪费。
谢谢!
编辑:
我之前提到的进程都是线程,并没有像我想的那样是独立的进程(check this)。
每个 http 请求都会创建一个新线程,这没问题,但是这个线程不会在脚本结束后被杀死。
此外,我发现如果请求处理程序不 运行 casper(我的意思是 casper.run(..)),则不会创建新线程。
因此,仅当服务器 运行 是 casper 实例时才会创建新线程,问题是此实例不会在 运行 函数结束后结束。
我试过 casper.done()
如下所述,但它杀死了整个进程而不是当前的 运行ning 线程。 (我没有找到此功能的任何文档)。
当我在同一台机器的服务器外执行其他casper脚本时,实例化线程和整个幻影进程成功结束。会发生什么?
我使用的是 Phantom 2.1.1 和 Casper 1.1.1 版本。
如果您想了解更多或具体信息,请问我。
再次感谢阅读!
这是一个众所周知的 casper 问题:
https://github.com/casperjs/casperjs/issues/1355
它还没有被 casper 的家伙修复,目前被标记为增强。我想这不在他们的优先列表中。
无论如何,解决方法是编写服务器端组件,例如一个 node.js 服务器来处理传入的请求,并为每个请求 运行 一个 casper 脚本来在新的子进程中进行抓取。当 casper 终止它的工作时,这个子进程将被关闭。虽然这是一种解决方法,但它并不是最佳解决方案,因为为每个请求打开子进程的成本并不便宜。很难大规模扩展与此类似的方法。但是,这是一个足够的解决方法。有关此完全明智的方法的更多信息,请参阅上面的 link。