提交任务的两张方式:

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. C# WCF发布服务的元数据的方式

    发布服务元数据的方式有两种:一是基于HTTP-GET协议提供元数据,它是一种绝大多数平台都能支持的简单text-based协议:另一种是元数据交换终结点. 1.基于HTTP-GET协议 <?xm ...

  2. SpringMVC页面中文乱码

    刚开始学习使用SpringMVC,完成配置之后开始编辑页面源码,添加了几个中文字符(index.jsp) <html> <body> <h2>hello world ...

  3. 【SQL-自动生成编号】按规则自动生成单据编号 以及并发问题_使用触发器、函数 等

    描述:每种单据新建时,自动生成它的单据编号. 规则如:固定码+日期+流水号 (ABC1603180001) 方法一:触发器 触发器的缺点是,执行了sql之后才看到编码. 测试:流水号不能超过最大数,否 ...

  4. C# 扩展方法——mysql-dapper(MySqlMapperExtensions)

    其他扩展方法详见:https://www.cnblogs.com/zhuanjiao/p/12060937.html 反射比较耗费性能,反射得到属性进行缓存 根据反射得到的属性,进行动态拼接sql语句 ...

  5. hdu 2553 八皇后问题 基础

    题意:给你一个n*n的棋盘,要求放n个皇后: <span style="font-size:18px;">#include <iostream> #incl ...

  6. tarjan算法 习题

    dfs树与tarjan算法 标签(空格分隔): 517coding problem solution dfs树 tarjan Task 1 给出一幅无向图\(G\),在其中给出一个dfs树\(T\), ...

  7. CodeForge源码分享

    <a target=_blank href=http://www.codeforge.cn/point/?recoid=2215596>CodeForge源码分享</a>

  8. SpringBoot 2.x 使用Redis作为项目数据缓存

    一.添加依赖 <!-- 添加缓存支持 --> <dependency> <groupId>org.springframework.boot</groupId& ...

  9. moment 时间格式化

    使用方法: 引入 moment 的包 moment(要处理的时间).format(时间的格式): vue 的过滤器为例: str 代表要处理的时间  orf 代表 时间的格式

  10. vuex 的介绍

    vue-cli 中 css 的作用域 scoped vue 数据的为响应数据,一改全改,一变全变的特性,我们的很多处理也会围绕着他 vuex 是处理数据的,是 vue 的数据仓库 vuex 的作用:采 ...