【发布时间】:2016-04-16 01:55:34
【问题描述】:
我在 Windows 7 上运行 Python 3.4。
我正在尝试更多地了解多处理,并尝试编写一个函数,该函数在另一个函数调用上执行干净的小超时。但是我遇到了一个我无法弄清楚的问题。
根据关于多处理的 Python 文档:
Terminate() "立即停止工作进程而不完成未完成的工作。"
但是,当我对此进行测试时,pool.terminate() 似乎在等待工作进程完成而不是杀死它们!
所以当我运行这段代码时:
import multiprocessing.pool
from time import sleep
def timeout(seconds, function, *args, **kwargs):
pool = multiprocessing.pool.ThreadPool(processes = 1)
result = pool.apply_async(function, args, kwargs)
try: result.get(seconds)
except multiprocessing.context.TimeoutError:
print("Process timed out")
pool.terminate()
pool.join()
print("Pool terminated")
finally:
pool.close()
def worker():
for n in range(5):
sleep(1)
print(n+1)
print("Process succeeded")
timeout(2.5, worker)
我希望结果是这样的:
1
2
Process timed out
Pool terminated
但是我得到了这个:
1
2
Process timed out
3
4
5
Process succeeded
Pool terminated
我知道result.get 引发了TimeoutError,因为消息“进程超时”已成功打印。而且我知道pool.terminate() 被调用是出于同样的原因,它似乎没有做任何事情!
我觉得这里有些东西我只是不理解。有人可以帮帮我吗?
【问题讨论】:
-
我猜这是一个 Windows 问题 - 对于 Linux,它几乎肯定会发送一个信号,这在 Windows 7 AFAIK 上不可用。