python concurrent.futures和processPoolexecutor提供了一个整洁的接口来安排和监视任务。futures evenprovidea.cancel()方法:
cancel():尝试取消呼叫。如果调用当前正在执行且无法取消,则方法将返回false,否则调用将被取消,方法将返回true。
不幸的是,在simmilar(关于asyncio)中,使用文档的这一截图,答案声明正在运行的任务是不可取消的,但是文档不会这样说,只有在它们正在运行且不可取消的情况下。
提交多处理。事件到进程也是不可能的(通过参数,如multiprocess.process返回runtimeerror)
我想做什么?我想划分一个搜索空间并为每个分区运行一个任务。但只要有一个解决方案就足够了,而且这个过程需要大量的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()))
最佳答案
很遗憾,无法取消运行Futures
我认为核心原因是确保在不同的实现上使用相同的API(不可能中断正在运行的线程或协程)。
Pebble库旨在克服这一限制和其他限制。
from pebble import ProcessPool
def function(foo, bar=0):
return foo + bar
with ProcessPool() as pool:
future = pool.schedule(function, args=[1])
# if running, the container process will be terminated
# a new process will be started consuming the next task
future.cancel()
关于python - Python:concurrent.futures如何使其可取消?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42782953/