起初我以为我有某种内存泄漏导致了一个问题,但我得到了一个例外,我不确定我是否完全理解,但至少我现在缩小了它。 / p>
我使用while循环来保持线程运行并检索数据。如果遇到问题,它会记录并继续运行。它似乎最初工作正常 - 至少第一次,然后它不断记录线程异常。
我把它缩小到这一部分:
while True:
yada yada yada...
#Works fine to this part
pool = ThreadPool(processes=1)
async_result = pool.apply_async(SpawnPhantomJS, (dcap, service_args))
Driver = async_result.get(10)
Driver.set_window_size(1024, 768) # optional
Driver.set_page_load_timeout(30)
我之所以这样做,是因为产生了很多selenium webdrivers的问题最终会超时(没有例外 - 只是挂在那里)并且使用它会使它超时,所以如果它不会产生10例外会抓住它再去。看起来像一个很好的修复。但我认为它会在循环中引发问题。
它可以正常工作,但然后在每个循环上抛出相同的异常。
我不太了解线程池,也许我不应该经常定义它。抓住这个问题是一个很难的例外,所以测试有点痛苦,但是我觉得这样的事情可能会解决它吗?
pool = ThreadPool(processes=1)
async_result = pool.apply_async(SpawnPhantomJS, (dcap, service_args))
while True:
Driver = async_result.get(10)
对我来说看起来比较整洁,但我不能很好地理解这个问题,以确定它能解决它。
我真的很感激任何建议。
更新
我已经跟踪了这部分代码的问题100%我在它之前放了一个名为bugcounter = 1的变量,之后是= 2并将其记录在异常上。
但是当尝试在循环中使用此代码重现它时它运行正常并且不断产生Web驱动程序。所以我不知道。
进一步更新:
我可以在本地运行几个小时。有时它会在(Windows)服务器上运行几个小时。但过了一段时间它在这里失败了,我无法弄清楚原因。
可能会抛出异常,因为超时命中并且浏览器不会按时生成。这很少发生,但这就是我们回到它的原因。
我在这里的假设是我创建了太多的线程并且操作系统没有它。我刚刚发现,如果我在使用它来生成浏览器之后终止池,那么线程池可能会终止。
答案 0 :(得分:0)
我在最终答案中提出的问题解决了这个问题。
我使用线程池为浏览器产生超时,作为库中错误的解决方法。但是我没有终止那个线程池,所以最终在x个循环之后操作系统不会让它创建另一个池。
在生成浏览器并且不再需要池后添加.terminate解决了问题。