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!

异步调用与回调机制:

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!

原文地址:https://www.cnblogs.com/beallaliu/p/9192528.html

时间: 2024-10-12 19:58:44

5.1.23 异步调用与回调机制的相关文章

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

1.线程queue :会有锁 q=queue.Queue(3) q.get() q.put() 先进先出 队列后进先出 堆栈优先级队列 1 """先进先出 队列""" 2 import queue 3 q=queue.Queue(3) #先进先出->队列 4 5 q.put('first') 6 q.put(2) 7 # q.put('third') 8 # q.put(4) 9 q.put(4,block=False) #q.put_no

异步调用与回调机制,协程

1.异步调用与回调机制 上一篇我们已经了解到了两组比较容易混淆的概念问题,1.同步与异步调用 2.阻塞与非阻塞状态.在说到异步调用的时候,说到提交任务后,就直接执行下一行代码,而不去拿结果,这样明显存在缺陷,结果是肯定要拿的,这辈子都肯定是要拿到这个结果的,没有这个结果后面的活又不会干,没办法,只能去拿结果的,那么问题是异步调用提交任务后,如何实现既要拿到结果又不需要原地等的理想状态呢?专门为异步调用配备了一个方法--回调机制 先来想想我们之前是怎么拿到一个函数的结果,就传给另外一个函数取执行,

异步调用与回调机制

提交任务的两种方式. 同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行 异步调用:提交完任务后,不等待任务执行完毕 from concurrent.futures import ThreadPoolExecutor import time,random def la(name): print('%s is laing'%name) time.sleep(random.randint(3,5)) res = random.randint(7,13)*

浅谈委托,事件,异步调用,回调等概率

直接说题. 委托         首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托.       委托是某一类方法的总定义.    事件           事件是某个类用于传递消息的方式.事件之余委托,犹如属性之余变量即是委托的封装.     好了,明确了概念,接下来说示例.    示例         有3个对象  鼠标,button,winform .鼠标点击button对象,触发button的c

深入浅出: Java回调机制(异步)

Writer      :BYSocket(泥沙砖瓦浆木匠) 什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道"就一个回调-".此时千万个草泥马飞奔而过(逃 哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉.不妨总结总结. 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. 回调是一种特殊的调用,至于三种方式也有点不同. 1.同步

C# 同步调用 异步调用 异步回调 多线程的作用

同步调用   : 委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 异步调用  :同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了.异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行.委托的异步调用通过BeginInvoke和EndInvoke来实现. 异步回调函数  :当异步调用时,主线程并没有等待,而是

Java接口回调机制

一.前言 最近在看android Fragment与Activity进行数据传递的部分,看到了接口回调的内容,今天来总结一下. 二.回调的含义和用途 1.什么是回调? 一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类同步调用.异步调用和回调.同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行.异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B

谈.Net委托与线程——创建无阻塞的异步调用

前言 本文大部分内容来自于mikeperetz的Asynchronous Method Invocation及本人的一些个人体会所得,希望对你有所帮助.原英文文献可以在codeproject中搜索到. 介绍 这篇文章将介绍异步调用的实现机制及如何调用异步方法.大多数.NET开发者在经过delegate.Thread.AsynchronousInvocation之后,通常都会对以上概念产生混淆及误用.实际上,以上概念是.NET2.0版本中对并行编程的核心支持,基于概念上的错误认识有可能导致在实际的

C#委托异步调用

废话不多说,直接上代码(PS:我就喜欢简单.直接.粗暴) using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Remoting.Messaging;using System.Text;using System.Threading;using System.Threading.Tasks; namespace 异步调用委托{    class Program    {