对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读取配置文件模块ConfigParser
May 11 Python
浅谈Django REST Framework限速
Dec 12 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
python实现调用摄像头并拍照发邮箱
Apr 27 Python
python字典的元素访问实例详解
Jul 21 Python
使用python求解迷宫问题的三种实现方法
Mar 17 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写的采集程序
2007/03/16 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
JavaScript 基础问答三
2008/12/03 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
Python中List.count()方法的使用教程
2015/05/20 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
深入了解Python在HDA中的应用
2019/09/05 Python
关于Pytorch的MNIST数据集的预处理详解
2020/01/10 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
科研先进个人典型材料
2014/01/31 职场文书
后勤部经理岗位职责
2014/02/23 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
工作简历自我评价
2015/03/11 职场文书
Go并发4种方法简明讲解
2022/04/06 Golang
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android