我在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()
之所以被调用是出于同样的原因,它似乎什么都没做!我觉得这里有些东西我只是不了解。有人可以帮我吗?
最佳答案
我不知道为什么,但是问题似乎是由pool.join()
调用引起的,无论如何您实际上并不需要此调用,因为据称工作进程是由前面的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(timeout=seconds)
except multiprocessing.TimeoutError:
print("Process timed out")
pool.terminate()
# pool.join() # Don't need this, all worker threads have been stopped.
print("Pool terminated")
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
无论如何,请注意,自版本3.3起,
Pool
对象支持上下文管理协议,这意味着Pool.terminate()
在使用时将被自动调用-因此该函数的编写方式可能更简洁:def timeout(seconds, function, *args, **kwargs):
with multiprocessing.pool.ThreadPool(processes=1) as pool:
result = pool.apply_async(function, args, kwargs)
try:
result.get(timeout=seconds)
except multiprocessing.TimeoutError:
print("Process timed out")
print("Pool terminated")
关于python - 多处理线程池未按预期终止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36651075/