对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实现的简单发送邮件脚本分享
Nov 07 Python
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
Python学习入门之区块链详解
Jul 25 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
Python中判断输入是否为数字的实现代码
May 26 Python
python在OpenCV里实现投影变换效果
Aug 30 Python
Python函数的默认参数设计示例详解
Dec 01 Python
如何给Python代码进行加密
Jan 10 Python
tensorflow 变长序列存储实例
Jan 20 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
python程序如何进行保存
Jul 03 Python
python操作微信自动发消息的实现(微信聊天机器人)
Jul 14 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
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
php防止sql注入代码实例
2013/12/18 PHP
php递归删除目录与文件的方法
2015/01/30 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
Python3安装Pymongo详细步骤
2017/05/26 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
pyshp创建shp点文件的方法
2018/12/31 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
法国足球商店:Footcenter
2019/07/06 全球购物
家长学校工作方案
2014/05/07 职场文书
酒店节能减排方案
2014/05/26 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
单位推荐信范文
2015/03/27 职场文书
治理商业贿赂工作总结
2015/08/10 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers