我有以下功能:
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函数。
我不确定为什么有时会引发这种异常,而不是其他异常。
答案 0 :(得分:3)
ThreadPool(processes=pool_size)
失败时会引发异常。发生这种情况时,会引发异常而不是正在创建的池,这意味着永远不会分配pool
变量。
然后立即执行finally
块,并尝试拨打pool.close()
,由于pool
从未分配,因此会UnboundLocalError
。
将pool = ThreadPool(pool_size)
行移出try
块。它还有一个额外的好处,就是告诉你为什么线路失败。