对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实现的百度贴吧网络爬虫实例
Apr 17 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 Python
使用python判断你是青少年还是老年人
Nov 29 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
python网络爬虫 CrawlSpider使用详解
Sep 27 Python
pytorch实现特殊的Module--Sqeuential三种写法
Jan 15 Python
Python 如何批量更新已安装的库
May 26 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 29 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
在线竞拍系统的PHP实现框架(一)
2006/10/09 PHP
php 文本文件的读取效率
2012/02/10 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
PHP云打印类完整示例
2016/10/15 PHP
浅谈PHP的反射API
2017/02/26 PHP
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
javascript实现简单的省市区三级联动
2015/05/14 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
[03:43]TI9战队采访——PSG.LGD
2019/08/22 DOTA
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
用Django写天气预报查询网站
2018/10/21 Python
django celery redis使用具体实践
2019/04/08 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
美国宠物护理专家:Revival Animal Health
2020/01/05 全球购物
What is view? why do we have view?
2012/06/22 面试题
人事文员岗位职责
2014/02/16 职场文书
企业管理标语
2014/06/10 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
Python几种酷炫的进度条的方式
2022/04/11 Python