提交任务的两张方式:

1.同步调用

2.异步调用

同步调用:提交完任务后,就在原地等待任务执行完后,拿到结果,再执行下一行代码

同步调用,导致程序串行执行

from concurrent.futures import ThreadPoolExecutor
import time
import random def la(name):
print("%s is 正在拉" % name)
time.sleep(random.randint(1,3))
res = random.randint(1,10) * "#"
return {"name":name,"res":res} def weigh(shit):
name = shit["name"]
size = len(shit["res"])
print("%s 拉了《%s》kg" %(name,size)) if __name__ == "__main__":
pool = ThreadPoolExecutor(13) shit1 = pool.submit(la,"mike").result()
weigh(shit1)
shit2 = pool.submit(la,"peter").result()
weigh(shit2)
shit3 = pool.submit(la,"jack").result()
weigh(shit3) '''
mike is 正在拉
mike 拉了《2》kg
peter is 正在拉
peter 拉了《9》kg
jack is 正在拉
jack 拉了《4》kg
'''

异步调用:提交完任务后,不再原地等待任务执行完

from concurrent.futures import ThreadPoolExecutor
import time
import random def la(name):
print("%s is 正在拉" % name)
time.sleep(random.randint(1,3))
res = random.randint(1,10) * "#"
return weigh({"name":name,"res":res}) def weigh(shit):
name = shit["name"]
size = len(shit["res"])
print("%s 拉了《%s》kg" %(name,size)) if __name__ == "__main__":
pool = ThreadPoolExecutor(13) pool.submit(la,"mike")
pool.submit(la,"peter")
pool.submit(la,"jack") '''
mike is 正在拉
peter is 正在拉
jack is 正在拉
mike 拉了《3》kg
jack 拉了《8》kg
peter 拉了《1》kg
'''

回调函数

可以为进程池或线程池内的每个进程或线程绑定一个函数,该函数在进程或线程的任务执行完毕后自动触发,并接收任务对象的返回值当作参数传给绑定的函数,该函数称为回调函数

add_done_callback() 
传的是要绑定的函数,还要在函数,func拿到的是一个future对象obj,需要用obj.result()拿到结果
 
from concurrent.futures import ThreadPoolExecutor
import time
import random def la(name):
print("%s is 正在拉" % name)
time.sleep(random.randint(1,3))
res = random.randint(1,10) * "#"
return {"name": name, "res": res} def weigh(shit):
shit = shit.result()
name = shit["name"]
size = len(shit["res"])
print("%s 拉了《%s》kg" %(name,size)) if __name__ == "__main__":
pool = ThreadPoolExecutor(13) pool.submit(la,"mike").add_done_callback(weigh)
pool.submit(la,"peter").add_done_callback(weigh)
pool.submit(la,"jack").add_done_callback(weigh)

同步调用就是阻塞?

同步和阻塞没有关系,同步调用只是一种提交任务方式,同步提交完任务后,不管程序是计算密集型还是io密集型程序,它都会原地等待任务执行。

python 并发编程 同步调用和异步调用 回调函数的更多相关文章

  1. Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程

    Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...

  2. python网络编程-同步IO和异步IO,阻塞IO和非阻塞IO

    同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...

  3. Python 3 并发编程多进程之进程池与回调函数

    Python 3 进程池与回调函数 一.进程池 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.多进程是实现并发的手段之一,需要注意 ...

  4. python网络编程--管道,信号量,Event,进程池,回调函数

    1.管道 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行任务修改,即串行修改,速度慢了,但牺牲了速度却保证了数据安全. 文件共享数据实现进程间的通信,但问题是: 1.效率低(共享 ...

  5. Python并发编程-进程池及异步方式

    进程池的基本概念 为什么有进程池的概念 效率问题 每次开启进程,都需要开启属于这个进程的内存空间 寄存器,堆栈 进程过多,操作系统的调度 进程池 python中的 先创建一个属于进程的池子 这个池子指 ...

  6. python 并发编程 多线程 目录

    线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...

  7. Python并发编程-线程同步(线程安全)

    Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...

  8. C#“同步调用”、“异步调用”、“异步回调”

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

  9. C#(同步调用、异步调用、异步回调)

    Review: 原作者虽然使用了汉字的类名,看起来十分蹩脚,但是,还是把同步调用.异步调用.异步回调的使用讲解的很详细的.原理讲解的很清晰. ------ 本文将主要通过“同步调用”.“异步调用”.“ ...

随机推荐

  1. AXIOS构建请求处理全局loading状态&&AXIOS避免重复请求loading多次出现

    一般情况下,在 vue 中结合 axios 的拦截器控制 loading 展示和关闭,是这样的:在 App.vue 配置一个全局 loading. <div class="app&qu ...

  2. LINUX学习之二磁盘篇

    1.Linux系统中,每个设备都被当成一个文件来对待.文件系统的最小单位是区块(Block) 设备 设备在Linux中的文件名 IDE硬盘 /dev/hd[a-d] SCSI/SATA/USB硬盘 / ...

  3. 关于python-selenium-chromedriver提示

    问题一:AttributeError: module 'selenium.webdriver' has no attribute 'Chromedriver' 配置selenium环境时,执行代码 f ...

  4. ubuntu16.04配置记录

    新开一篇随笔记录ubuntu16.04配置中遇到的坑 1.安装Bumblebee(大黄蜂) Bumblebee是一款双显卡驱动,可以关闭独显,有效控制笔记本发热 第一步:安装我们的主角Bumblebe ...

  5. [CSP-S模拟测试]:线性代数(模拟)

    题目传送门(内部题113) 输入格式 第一行一个正整数$n$. 接下来$n$行,每行$n$个整数,描述$C$矩阵.保证输入的是一个林先森矩阵. 输出格式 若不可能实现,则输出一行$Impossible ...

  6. 高性能JavaScript之加载和执行

    JS在浏览器中的性能,可以认为是开发者所面临的最重要的可行性问题.这个问题因JS的阻塞特性变得复杂,也就是说当浏览器在执行JS代码时,不能同时做其他任何事情.事实上,大多数浏览器都使用单一进程来处理U ...

  7. RabbitMq运行原理浅析

    转载:https://blog.csdn.net/Evankaka/article/details/80977027 1.RabbitMq简介     AMQP,即Advanced Message Q ...

  8. shiro所需的依赖

    <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring< ...

  9. 对保存的参数checkpoints进行可视化读取 1.pywrap_tensorflow.NewCheckpoint(获得checkpoint的读取器) 2.np.save(对npy文件进行保存) 3.tl.file.load_npy_to_any(对保存的npy文件进行读取)

    1. pywrap_tensorflow.NewCheckpoint(path)获得checkpoint的读取器 参数说明: path表示checkpoint的路径 2.np.save(path, d ...

  10. 4. 获取当前的文件夹的路径,以及当前文件名的路径 os.path.realpath

    使用os.path.realpath(__file__) 获得当前的文件夹的路径名, 使用os.path.split 进行路径切割 import os src, _= os.path.split(os ...