协程(coroutine)
也叫:微线程,是一种用户态的轻量级线程,就是在单线程下实现并发的效果。
优点:
1:无需线程上下文切换的开销。(就是函数之间来回切换)
2:无需原子操作锁定及同步的开销。(如改一个变量就相当于一个原子操作,因为协程是在单线程内操作,属于串行,所以不需要锁的操作)
3:方便切换控制流,简化编程模型。
4:高并发+高扩展+低成本:一个CPU支持上万个协程都不是问题,所以很适合用于高并发处理。(因为它都在一个线程里处理)
缺点:
1:无法利用多核资源,协程的本质是个单线程,它不能同时将单个CPU上的多个核用上,协程需要和进程配合才能运行在多CPU上,一般用于CPU密集型
2:进行阻塞操作会阻塞掉整个程序
gevent (实现自动切换):是一个第三方库,可以通过gevent实现并发同步或异步编程,其中的主要模式是Greenlet,
greenlet (实现手动切换)由gevent进行了封装

举例:通过手动切换实现协程

 1 import gevent
 2 def fun1():
 3     print('输出函数1')
 4     gevent.sleep(2)
 5     print('函数1结束')
 6 def fun2():
 7     print('输出函数2')
 8     gevent.sleep(1)
 9     print('函数2结束')
10 def fun3():
11     print('输出函数3')
12     gevent.sleep(0)
13     print('函数3结束')
14 gevent.joinall([gevent.spawn(fun1),gevent.spawn(fun2),gevent.spawn(fun3)])生成3个函数的自动切换

View Code

以上代码解释:对3个函数生成自动切换,先运行fun1函数,遇到sleep(2)是,执行等待2秒,然后直接切换到fun2函数,执行遇到sleep(1)时,执行
等待1秒,继续切换到fun3函数,执行遇到sleep(0)时切换到fun1函数,发现sleep(2)未完成,又切换入fun2函数发现sleep(1)也没有执行完成,
继续切换如fun3函数,这里sleep(0)不用等待,直接执行fun3的最后一个print,执行完成后,返回fun1函数的sleep,发现没有完成,又切入
fun2函数,发现sleep(1)已完成,可以向下继续执行,执行完下面的语句后,最后返回fun1,这时fun1的sleep(2)已完成,继续执行fun1剩下的语句。

举例:使用普通串行爬网页与使用协程的gevent进行爬网页对比用时

import gevent,time
from gevent import monkey
from urllib import request
monkey.patch_all() # gevent补丁,把当前的所有的IO操作都单独的坐上标记def web(url):print('开始爬网页%s' % url)res = request.urlopen(url)data = res.read()print('%d bytes received from %s' % (len(data),url))
urls = ['https://web1/','https://web2/','https://web3/'
]
# 串行模式执行
time_start = time.time()
for url in urls:web(url)
print('同步cost',time.time()-time_start)
# 协程并发模式执行
async_time_start = time.time()
gevent.joinall([gevent.spawn(web,'https://web1/'),gevent.spawn(web,'https://web2/'),gevent.spawn(web,'https://web3/')
])
print('异步cost',time.time()-async_time_start)

View Code

举例:通过协程实现一个socket服务器端(客户端没啥变化不写了)

 1 import sys,socket,time,gevent
 2 from gevent import socket,monkey
 3 monkey.patch_all()
 4
 5 def server():
 6     s = socket.socket()
 7     s.bind(('0.0.0.0',9999))
 8     s.listen(500)
 9     while True:
10         cli,addr = s.accept()
11        # 主要这里,将每个连进来的客户端对象交给协程并发处理
12         gevent.spawn(handle_request,cli)
13
14 def handle_request(client):
15     while True:
16         try:
17             data = client.recv(1024).decode()
18             print(data)
19             client.send(data.encode('utf-8'))
20             if not data:
21                 client.shutdown(socket.SHUT_WR)
22         except Exception as e:
23             print('err',e)
24         finally:
25             client.close()

View Code

转载于:https://www.cnblogs.com/zy6103/p/7017234.html

python学习之-- 协程相关推荐

  1. Python 学习笔记 - 协程

    Python里面控制并发,除了多线程和多进程,还可以使用协程(CoRoutine).他是在一个线程内通过程序员人为的指定来进行切换 例1:通过switch()可以人为来回切换到另外一个函数:当所有函数 ...

  2. python 协程可以嵌套协程吗_Python | 详解Python中的协程,为什么说它的底层是生成器?...

    今天是Python专题的第26篇文章,我们来聊聊Python当中的协程. 我们曾经在golang关于goroutine的文章当中简单介绍过协程的概念,我们再来简单review一下.协程又称为是微线程, ...

  3. Python 异步,协程,学起来好头疼,Python爬虫程序能调用GPU去爬东西吗?

    78 技术人社群日报时间 文章目录 Python 爬虫程序能调用 GPU 去爬东西吗? Python 异步,协程--,学起来好头疼 有没有牛子大的说下 `matplotlib` 里 `plot` 和 ...

  4. python中的协程(二)

    协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地,该线程内的其他 ...

  5. python并发之协程_python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  6. Python与Golang协程异同

    背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...

  7. 二十五、深入Python中的协程

    @Author: Runsen 一说并发,你肯定想到了多线程+进程模型,确实,多线程+进程,正是解决并发问题的经典模型之一.但对于多核CPU,利用多进程+协程的方式,能充分利用CPU,获得极高的性能. ...

  8. Python中的协程

    Python中的协程 文章目录 Python中的协程 一.什么是协程 1.概念 2.协程的好处 3.缺点 二.了解协程的过程 1.yield工作原理 2.协程在运行过程中有四个状态: 3.预激协程的装 ...

  9. Python并发之协程gevent基础(5)

    1,gevent介绍 gevent是第三方库,通过 greenlet 实现 coroutine,创建.调度的开销比 线程(thread) 还小,因此程序内部的 执行流 效率高. gevent 实现了 ...

最新文章

  1. 寒假作业--微信小程序开发1
  2. semester 2 deadline from the computer science and electronic engineering
  3. JAVA——HttpClient封装工具类
  4. 判断某程序是64位还是32位
  5. ubuntu下ZED相机开发环境安装
  6. (36)FPGA三种基本逻辑门(与门)
  7. Leanote使用mysql_《搭建个人Leanote云笔记本》阿里云体验实验室 教程
  8. citrixreceiver云桌面系统_CStack xView桌面云平台与方德操作系统完成兼容性认证
  9. dynamic image
  10. 征信前置查询接口调用联调测试
  11. 03-java制作统计图(柱状,饼状,折线状)
  12. 计算机 打印 速度慢,处理打印机在打印文件时打印速度过慢的原因
  13. office中计算机剪贴画,Office 2010的剪贴画
  14. 西门子Wincc/Step7/pcs7
  15. 【数据结构与算法】-6.1图的基本概念和术语
  16. thymeleaf 拼接src路径
  17. python用matplotlib画玫瑰_Python可视化:用Matplotlib画个玫瑰图
  18. 在Linux系统(CentOS 8.2)腾讯云服务器下部署原神云崽机器人(Yunzai-Bot)【保姆入门级】
  19. C语言实现打印某年某月的日历
  20. 计算机术语cpu是,计算机术语CPU.doc

热门文章

  1. 起始2021-01-15
  2. android wear 微信语音,moto 360手表语音回复微信教程
  3. rgb到yuv的转换
  4. MFC--学生管理系统
  5. 我们国家都有哪些信息安全标准
  6. 扇贝python_扇贝编程(python)手机版-扇贝编程app下载v1.1.30-汉化新世纪
  7. idrac虚拟控制台的使用
  8. unity实现太空场景
  9. 淘宝订单转化率低的原因,怎样提高店铺订单转化率,提高店铺订单转化率的小技巧
  10. Final Cut Pro 7非线性编辑高级教程