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

10.6.4 Future回调
要在任务完成时采取某个动作,不用显式地等待结果,可以使用add_donecallabck()指示future完成时要调用一个新函数。这个回调应当是有一个参数(Future实例)的callable函数。

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():
        error = fn.exception()
        if error:
            print('{}:error returned: {}'.format(
                fn.arg,error))
        else:
            result = fn.result()
            print('{}: value returned: {}'.format(
                fn.arg,result))


if __name__ == '__main__':
    ex = futures.ThreadPoolExecutor(max_workers=2)
    print('main:starting')
    f = ex.submit(task,5)
    f.arg = 5
    f.add_done_callback(done)
    result = f.result()

不论由于什么原因,只要认为Future“完成”,就会调用这个回调,所以在使用它之前必须检查传入回调的对象的状态。
运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值