对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 相关文章推荐
用于业余项目的8个优秀Python库
Sep 21 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
python五子棋游戏的设计与实现
Jun 18 Python
python中metaclass原理与用法详解
Jun 25 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
Django 多对多字段的更新和插入数据实例
Mar 31 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 Python
Python存储读取HDF5文件代码解析
Nov 25 Python
C++和python实现阿姆斯特朗数字查找实例代码
Dec 07 Python
Python PIL按比例裁剪图片
May 11 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
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
用PHP实现多服务器共享SESSION数据的方法
2007/03/16 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
jquery构造器的实现代码小结
2011/05/16 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
layui表格数据重载
2019/07/27 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
python设置windows桌面壁纸的实现代码
2013/01/28 Python
浅谈scrapy 的基本命令介绍
2017/06/13 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
python 实现敏感词过滤的方法
2019/01/21 Python
Python json转字典字符方法实例解析
2020/04/13 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
小学生期末评语大全
2014/04/21 职场文书
建筑投标担保书
2014/05/20 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
会议开幕词
2015/01/28 职场文书
店长岗位职责
2015/02/11 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技