对Python协程之异步同步的区别详解


Posted in Python onFebruary 19, 2019

一下代码通过协程、多线程、多进程的方式,运行代码展示异步与同步的区别。

import gevent
import threading
import multiprocessing
# 这里展示同步和异步的性能区别,可以看到异步直接同时执行并完成,
# 而同步,需要等待第一个完成后再次执行下一个,是有顺序的执行,而异步不需要
import time


def task(pid):
  gevent.sleep(0.5)
  print('Task %s done' % pid)

def task2(pid):
  time.sleep(0.5)
  print('Task %s done'%pid)

def synchronous():
  for i in range(1, 10):
    task(i)

def asynchronous():
  threads = [gevent.spawn(task, i) for i in range(1,10)]
  gevent.joinall(threads)

def thread_chronous():
  t_list = []
  for i in range(1,10):
    t = threading.Thread(target=task2,args=(i,))
    t.start()
    t_list.append(t)
  for j in t_list:
    j.join()

def multi_chronous():
  t_list = []
  for i in range(1, 10):
    t = multiprocessing.Process(target=task2, args=(i,))
    t.start()
    t_list.append(t)
  for j in t_list:
    j.join()

# 同步执行
print('Synchronous:')
synchronous()
# 开启协程异步执行 自动切换函数
print('Asynchronous:')
asynchronous()
# 开启线程异步执行
print('Threading')
thread_chronous()
# 开启进程的异步执行
if __name__ == '__main__':
  print('Multiprocess')
  multi_chronous()

关于异步 同步的一些理解:

同步和异步的区别就在于是否等待IO执行的结果。好比你去麦当劳点餐,你说“来个汉堡”,服务员告诉你,对不起,汉堡要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场,这是同步IO。

你说“来个汉堡”,服务员告诉你,汉堡需要等5分钟,你可以先去逛商场,等做好了,我们再通知你,这样你可以立刻去干别的事情(逛商场),这是异步IO。

老张爱喝茶,废话不说,煮开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。

1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻

2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。

3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大

4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得自己聪明了。所谓同步异步,只是对于水壶而言。普通水壶,同步;响水壶,异步。虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。所谓阻塞非阻塞,仅仅对于老张而言。立等的老张,阻塞;看电视的老张,非阻塞。情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

以上这篇对Python协程之异步同步的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
在Python中处理字符串之isdigit()方法的使用
May 18 Python
Django小白教程之Django用户注册与登录
Apr 22 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
Python使用reportlab模块生成PDF格式的文档
Mar 11 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
Python实现动态循环输出文字功能
May 07 Python
python使用自定义钉钉机器人的示例代码
Jun 24 Python
django restframework serializer 增加自定义字段操作
Jul 15 Python
详解在OpenCV中如何使用图像像素
Mar 03 Python
在python里从协程返回一个值的示例
Feb 19 #Python
Python3多线程基础知识点
Feb 19 #Python
Python进阶之全面解读高级特性之切片
Feb 19 #Python
在python里协程使用同步锁Lock的实例
Feb 19 #Python
对python 通过ssh访问数据库的实例详解
Feb 19 #Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 #Python
深入理解Django-Signals信号量
Feb 19 #Python
You might like
PHP开发文件系统实例讲解
2006/10/09 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
python监控nginx端口和进程状态
2019/09/06 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
Python递归函数特点及原理解析
2020/03/04 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
法律工作求职自荐信
2013/10/31 职场文书
小学教师岗位职责
2013/11/25 职场文书
秋季校运动会广播稿
2014/02/23 职场文书
个人委托书怎么写
2014/04/04 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
催款通知书范文
2015/04/17 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏