提交任务的两张方式:

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. H5实现手写功能

    html <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf- ...

  2. Python 面向对象Ⅴ

    基础重载方法 下表列出了一些通用的功能,你可以在自己的类重写: 运算符重载 Python同样支持运算符重载,实例如下: 以上代码执行结果如下所示: 类属性与方法 类的私有属性 __private_at ...

  3. __stdcall、__cdcel、__fastcall 调用

    常用的调用约定有stdcall,cdecl,fastcall,thiscall,naked call等,以下将 __stdcall.__cdecl和__fastcall三种函数调用协议加以比较,函数调 ...

  4. EasyUI DataGrid undefined处理

    处理undefined var val = null; console.log(val); console.log(val || ""); val = undefined; con ...

  5. POJ 3061  Subsequence   尺取法   挑战146页

    ---恢复内容开始--- Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10487   Accept ...

  6. C++ list用法总结

    头文件 #include<list> 声明一个int型的list:list a: 1.list的构造函数 list<int>a{1,2,3} list<int>a( ...

  7. 关于spark与scala版本问题记录

    记录一下版本问题: spark与scala版本对应问题: 1.官网会给出,如下,spark2.3.1默认需要scala2.11版本 2.在maven依赖网中也可以看到,如下 3.关于idea开发版本中 ...

  8. jquery 动态增加删除行

    最近写程序,碰巧有动态增加删除行,下面就记录一下 html就不写了,也没有什么,直接上核心了 新增行 function addRow(obj){ //获得table一共有多少行,方便追加的时候给序号赋 ...

  9. 分布式-网络通信-线程(socket)

    package OIO; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; i ...

  10. log4j动态配置参数

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...