对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 字符串split的用法分享
Mar 23 Python
python新手经常遇到的17个错误分析
Jul 30 Python
Python自动连接ssh的方法
Mar 07 Python
深入理解python中的闭包和装饰器
Jun 12 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 Python
Python实现确认字符串是否包含指定字符串的实例
May 02 Python
python3 判断列表是一个空列表的方法
May 04 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
python温度转换华氏温度实现代码
Dec 06 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
session 加入redis的实现代码
2016/07/15 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
2016/07/14 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
2019/06/24 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
python实现中文转换url编码的方法
2016/06/14 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
Django之模型层多表操作的实现
2019/01/08 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
python和php哪个更适合写爬虫
2020/06/22 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
基本款天堂:Everlane
2017/05/13 全球购物
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
机房搬迁方案
2014/05/01 职场文书
部队2014年终工作总结
2014/11/27 职场文书
springboot如何初始化执行sql语句
2021/06/22 Java/Android
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
「月刊Action」2022年5月号封面公开
2022/03/21 日漫