Pytest间歇性使用multiprocessing.pool.ThreadPool失败

时间:2014-10-21 17:15:14

标签: python multithreading threadpool pytest

我有以下功能:

def parallel_ping(ip_addresses, deadline=1.0, interval=None, attempts=None, pool_size=20):
    try:
        pool = ThreadPool(processes=pool_size)
        args = ((ip, deadline, interval, attempts) for ip in ip_addresses)
        result = pool.map_async(ping_check, args)
        return result.get()
    finally:
        pool.close()

ping_check是一个实际ping设备的功能(ip_addresses)

在我的测试中,我已经模拟了ping_check函数(用一个返回packet_loss的函数替换它)。

有时当测试运行时会引发异常:

UnboundLocalError: local variable 'pool' referenced before assignment

我的测试函数位于一个继承自unittest.TestCase的test_class中,并且有一个

def setUp(self):
    self.old_function = ping_check

def tearDown(self):
    ping_check = self.old_function

功能

在测试功能中,我正在分配ping_check = mock_ping_check 然后在那里调用parallel_ping函数。

我不确定为什么有时会引发这种异常,而不是其他异常。

1 个答案:

答案 0 :(得分:3)

ThreadPool(processes=pool_size)失败时会引发异常。发生这种情况时,会引发异常而不是正在创建的池,这意味着永远不会分配pool变量。

然后立即执行finally块,并尝试拨打pool.close(),由于pool从未分配,因此会UnboundLocalError

pool = ThreadPool(pool_size)行移出try块。它还有一个额外的好处,就是告诉你为什么线路失败。