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/

10-10 18:20
查看更多