对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 ljust rjust center输出
Sep 06 Python
用Python操作字符串之rindex()方法的使用
May 19 Python
Python正则表达式教程之一:基础篇
Mar 02 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
Nov 29 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
python pandas 组内排序、单组排序、标号的实例
Apr 12 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
使用Python实现跳帧截取视频帧
May 31 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
使用python接受tgam的脑波数据实例
Apr 09 Python
浅谈Python程序的错误:变量未定义
Jun 02 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服务器配置指南与使用经验的深入解析
2013/06/17 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
jquery实现图片预加载
2015/12/25 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
Vue用v-for给src属性赋值的方法
2018/03/03 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
python在控制台输出进度条的方法
2015/06/20 Python
详解Django 时间与时区设置问题
2019/07/23 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
大整数数相乘的问题
2012/07/22 面试题
老总助理工作岗位职责
2014/02/06 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
六查六看剖析材料
2014/10/06 职场文书
2015新生加入学生会自荐书
2015/03/24 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
七年级作文之游记
2019/12/11 职场文书
Java Dubbo框架知识点梳理
2021/06/26 Java/Android