5.1.23 异步调用与回调机制

Posted beallaliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.1.23 异步调用与回调机制相关的知识,希望对你有一定的参考价值。

提交任务的两种方式
#1、同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行

#2、异步调用:提交完任务后,不地等待任务执行完毕

 

同步调用:

from concurrent.futures import ThreadPoolExecutor
import random
import time


def la(name):
    print(name,正在拉。。。。)
    res = random.randint(0, 10)
    time.sleep(res)
    return {name: name, res: res}


def weight(obj):
    print(%s 拉了 %s kg! % (obj[name], obj[res]))


if __name__ == __main__:
    pool = ThreadPoolExecutor(3)

    # 同步调用,等待执行结果
    # eggon = pool.submit(la, ‘eggon‘).result(timeout=2)
    eggon = pool.submit(la, eggon).result()
    pool.submit(weight(eggon))

    alex = pool.submit(la, alex).result()
    pool.submit(weight(eggon))

运行结果:

技术分享图片
eggon 正在拉。。。。
eggon 拉了 5 kg!
alex 正在拉。。。。
eggon 拉了 5 kg!
View Code

 

 

异步调用与回调机制:

from concurrent.futures import ThreadPoolExecutor
import random
import time


def la(name):
    print(name,正在拉。。。。)
    res = random.randint(0, 10)
    time.sleep(res)
    return {name: name, res: res}


def weight(obj):
    # print(obj)  # obj是pool.submit(la, ‘eggon‘)的对象,要获取结果需要obj.result()获取函数la的返回值
    obj = obj.result()
    print(%s 拉了 %s kg! % (obj[name], obj[res]))


if __name__ == __main__:
    pool = ThreadPoolExecutor(3)

    # 异步调用,不等待执行结果,继续执行下一行代码
    # pool.submit(la, ‘eggon‘).add_done_callback(weight) 意思是:
    # 执行函数la
    # 执行结果后,把pool.submit(la, ‘eggon‘)对象当作weight的参数
    # 再执行weight函数。
    
    pool.submit(la, eggon).add_done_callback(weight) #回调add_done_callback函数weight的参数是pool.submit(la, ‘eggon‘)对象,所以weight只能有一个参数
    pool.submit(la, alex).add_done_callback(weight) 

执行结果:

技术分享图片
eggon 正在拉。。。。
alex 正在拉。。。。
<Future at 0x103da2f98 state=finished returned dict>
eggon 拉了 8 kg!
<Future at 0x103f609b0 state=finished returned dict>
alex 拉了 8 kg!
View Code

 


以上是关于5.1.23 异步调用与回调机制的主要内容,如果未能解决你的问题,请参考以下文章

异步调用与回调机制

异步调用与回调机制

java回调机制(老板与员工例子)

阿里P7大神:深入理解Java回调机制总结(同步回调/异步回调)

简单理解函数回调——同步回调与异步回调

并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制