第十章:使用进程、线程和协程提供并发性-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()返回一个布尔值,指示任务是否可以撤销。
运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值