Python concurrent.futures和ProcessPoolExecutor提供了一个简洁的接口来安排和监控任务。Futures甚至提供了一个.cancel()方法:provide
cancel(): 尝试取消调用。如果调用正在执行且无法取消,则该方法将返回False,否则调用将被取消,并且方法将返回True。
不幸的是,在类似question(关于asyncio的问题)中,答案声称使用文档片段运行的任务无法被取消,但文档并未说明这一点,只有在它们正在运行且无法取消时才不能取消。
向进程提交multiprocessing.Events也不是一件容易的事情(通过参数这样做会返回RuntimeError,就像在multiprocess.Process中一样)
我想做什么? 我想将搜索空间分区并对每个分区运行任务。但是只需要一个解决方案,该过程会消耗CPU资源。因此,有没有实际舒适的方法可以完成此操作,而不会抵消使用ProcessPool所带来的好处?
示例:
from concurrent.futures import ProcessPoolExecutor, FIRST_COMPLETED, wait
# function that profits from partitioned search space
def m_run(partition):
for elem in partition:
if elem == 135135515:
return elem
return False
futures = []
# used to create the partitions
steps = 100000000
with ProcessPoolExecutor(max_workers=4) as pool:
for i in range(4):
# run 4 tasks with a partition, but only *one* solution is needed
partition = range(i*steps,(i+1)*steps)
futures.append(pool.submit(m_run, partition))
done, not_done = wait(futures, return_when=FIRST_COMPLETED)
for d in done:
print(d.result())
print("---")
for d in not_done:
# will return false for Cancel and Result for all futures
print("Cancel: "+str(d.cancel()))
print("Result: "+str(d.result()))
Event
设置为全局变量,而不是将其作为参数传递,参见https://dev59.com/BXI-5IYBdhLWcg3wxruQ。 - niemmi