对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下的XSLT API进行web开发的简单教程
Apr 15 Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
深入探究Django中的Session与Cookie
Jul 30 Python
python list元素为tuple时的排序方法
Apr 18 Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 Python
Python发展史及网络爬虫
Jun 19 Python
Python实现TCP通信的示例代码
Sep 09 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
python通过SSH登陆linux并操作的实现
Oct 10 Python
Python列表list操作相关知识小结
Jan 29 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 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
PHP自动更新新闻DIY
2006/10/09 PHP
一些 PHP 管理系统程序中的后门
2009/08/05 PHP
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
php购物车实现方法
2015/01/03 PHP
在openSUSE42.1下编译安装PHP7 的方法
2015/12/24 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
js验证表单第二部分
2006/11/25 Javascript
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
python动态性强类型用法实例
2015/05/09 Python
机器学习python实战之手写数字识别
2017/11/01 Python
利用python绘制正态分布曲线
2021/01/04 Python
HTML5 直播疯狂点赞动画实现代码 附源码
2020/04/14 HTML / CSS
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
公司企业表扬信
2014/01/11 职场文书
初中美术教学反思
2014/01/29 职场文书
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
公司开业庆典主持词
2014/03/21 职场文书
公休请假条
2014/04/11 职场文书
法院先进个人事迹材料
2014/05/04 职场文书
激励员工的口号
2014/06/16 职场文书
二婚主持词
2015/06/30 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
《秋天的图画》教学反思
2016/02/19 职场文书
如何写好开幕词?
2019/06/24 职场文书