python 并发编程 同步调用和异步调用 回调函数
提交任务的两张方式:
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 并发编程 同步调用和异步调用 回调函数的更多相关文章
- Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程
Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...
- python网络编程-同步IO和异步IO,阻塞IO和非阻塞IO
同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...
- Python 3 并发编程多进程之进程池与回调函数
Python 3 进程池与回调函数 一.进程池 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.多进程是实现并发的手段之一,需要注意 ...
- python网络编程--管道,信号量,Event,进程池,回调函数
1.管道 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行任务修改,即串行修改,速度慢了,但牺牲了速度却保证了数据安全. 文件共享数据实现进程间的通信,但问题是: 1.效率低(共享 ...
- Python并发编程-进程池及异步方式
进程池的基本概念 为什么有进程池的概念 效率问题 每次开启进程,都需要开启属于这个进程的内存空间 寄存器,堆栈 进程过多,操作系统的调度 进程池 python中的 先创建一个属于进程的池子 这个池子指 ...
- python 并发编程 多线程 目录
线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...
- Python并发编程-线程同步(线程安全)
Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...
- C#“同步调用”、“异步调用”、“异步回调”
本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...
- C#(同步调用、异步调用、异步回调)
Review: 原作者虽然使用了汉字的类名,看起来十分蹩脚,但是,还是把同步调用.异步调用.异步回调的使用讲解的很详细的.原理讲解的很清晰. ------ 本文将主要通过“同步调用”.“异步调用”.“ ...
随机推荐
- AXIOS构建请求处理全局loading状态&&AXIOS避免重复请求loading多次出现
一般情况下,在 vue 中结合 axios 的拦截器控制 loading 展示和关闭,是这样的:在 App.vue 配置一个全局 loading. <div class="app&qu ...
- LINUX学习之二磁盘篇
1.Linux系统中,每个设备都被当成一个文件来对待.文件系统的最小单位是区块(Block) 设备 设备在Linux中的文件名 IDE硬盘 /dev/hd[a-d] SCSI/SATA/USB硬盘 / ...
- 关于python-selenium-chromedriver提示
问题一:AttributeError: module 'selenium.webdriver' has no attribute 'Chromedriver' 配置selenium环境时,执行代码 f ...
- ubuntu16.04配置记录
新开一篇随笔记录ubuntu16.04配置中遇到的坑 1.安装Bumblebee(大黄蜂) Bumblebee是一款双显卡驱动,可以关闭独显,有效控制笔记本发热 第一步:安装我们的主角Bumblebe ...
- [CSP-S模拟测试]:线性代数(模拟)
题目传送门(内部题113) 输入格式 第一行一个正整数$n$. 接下来$n$行,每行$n$个整数,描述$C$矩阵.保证输入的是一个林先森矩阵. 输出格式 若不可能实现,则输出一行$Impossible ...
- 高性能JavaScript之加载和执行
JS在浏览器中的性能,可以认为是开发者所面临的最重要的可行性问题.这个问题因JS的阻塞特性变得复杂,也就是说当浏览器在执行JS代码时,不能同时做其他任何事情.事实上,大多数浏览器都使用单一进程来处理U ...
- RabbitMq运行原理浅析
转载:https://blog.csdn.net/Evankaka/article/details/80977027 1.RabbitMq简介 AMQP,即Advanced Message Q ...
- shiro所需的依赖
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring< ...
- 对保存的参数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 ...
- 4. 获取当前的文件夹的路径,以及当前文件名的路径 os.path.realpath
使用os.path.realpath(__file__) 获得当前的文件夹的路径名, 使用os.path.split 进行路径切割 import os src, _= os.path.split(os ...