对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实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
使用Python设计一个代码统计工具
Apr 04 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
Python爬虫抓取技术的一些经验
Jul 12 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
Python argparse模块使用方法解析
Feb 20 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
python实现人工蜂群算法
Sep 18 Python
Django项目创建及管理实现流程详解
Oct 13 Python
python实现不同数据库间数据同步功能
Feb 25 Python
pytorch锁死在dataloader(训练时卡死)
May 28 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之面向对象
2013/05/15 PHP
PHP全局变量与超级全局变量区别分析
2016/04/01 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
JavaScript浏览器选项卡效果
2010/08/25 Javascript
JS定时器实例
2013/04/17 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
Webpack3+React16代码分割的实现
2021/03/03 Javascript
Python提取网页中超链接的方法
2016/09/18 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
毕业生简单求职信
2013/11/19 职场文书
大学生毕业求职自荐书范文
2014/02/04 职场文书
大专毕业自我鉴定
2014/02/04 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
网络优化专员求职信
2014/05/04 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
详解Python 3.10 中的新功能和变化
2021/04/28 Python
pytorch 实现变分自动编码器的操作
2021/05/24 Python
javascript数组includes、reduce的基本使用
2021/07/02 Javascript