Windows上的Python线程问题

时间:2016-07-09 08:06:26

标签: python multithreading

起初我以为我有某种内存泄漏导致了一个问题,但我得到了一个例外,我不确定我是否完全理解,但至少我现在缩小了它。 / 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)服务器上运行几个小时。但过了一段时间它在这里失败了,我无法弄清楚原因。

可能会抛出异常,因为超时命中并且浏览器不会按时生成。这很少发生,但这就是我们回到它的原因。

我在这里的假设是我创建了太多的线程并且操作系统没有它。我刚刚发现,如果我在使用它来生成浏览器之后终止池,那么线程池可能会终止。

1 个答案:

答案 0 :(得分:0)

我在最终答案中提出的问题解决了这个问题。

我使用线程池为浏览器产生超时,作为库中错误的解决方法。但是我没有终止那个线程池,所以最终在x个循环之后操作系统不会让它创建另一个池。

在生成浏览器并且不再需要池后添加.terminate解决了问题。