第十章:使用进程、线程和协程提供并发性-concurrent.futures:管理并发任务池-撤销任务

10.6.5 撤销任务
如果一个Future已经提交但还没有启动,那么可以调用它的cancel()方法将其撤销。

from concurrent import futures
import time


def task(n):
    print('{}: sleeping'.format(n))
    time.sleep(0.5)
    print('{}:done'.format(n))
    return n / 10


def done(fn):
    if fn.cancelled():
        print('{}:canceled'.format(fn.arg))
    elif fn.done:
        print('{}: not canceled'.format(fn.arg))


if __name__ == '__main__':
    ex = futures.ThreadPoolExecutor(max_workers=2)
    print('main: starting')
    tasks = []

    for i in range(10,0,-1):
        print('main: submitting {}'.format(i))
        f = ex.submit(task,i)
        f.arg = i
        f.add_done_callback(done)
        tasks.append((i,f))

    for i,t in reversed(tasks):
        if not t.cancel():
            print('main: did not cancel {}'.format(i))

    ex.shutdown()

cancel()返回一个布尔值,指示任务是否可以撤销。
运行结果:
第十章:使用进程、线程和协程提供并发性-concurrent.futures:管理并发任务池-撤销任务_第1张图片

你可能感兴趣的:(Python标准库)