多任务5-协程(IO密集型适用)--gevent完成多任务及monkey补丁
代码:
import gevent def f1(n):
for i in range(n):
print(gevent.getcurrent(),i)
gevent.sleep(1) def f2(n):
for i in range(n):
print(gevent.getcurrent(),i)
gevent.sleep(0.1) def f3(n):
for i in range(n):
print(gevent.getcurrent(),i)
gevent.sleep(0.2) print("---1---")
# gevent比greenlet好的地方是,遇到sleep自动切换,但是不支持time.sleep(),支持gevent.sleep()
# 不止是sleep,但凡延时或者堵塞的东西全要换成gevent里面的
g1 = gevent.spawn(f1,5)
print("---2---")
g2 = gevent.spawn(f2,5)
print("---3---")
g3 = gevent.spawn(f3,5)
print("---4---")
g1.join()
g2.join()
g3.join()
结果:
---1---
---2---
---3---
---4---
<Greenlet at 0x1ba58dbc648: f1(5)> 0
<Greenlet at 0x1ba58dbc948: f2(5)> 0
<Greenlet at 0x1ba58dbca48: f3(5)> 0
<Greenlet at 0x1ba58dbc948: f2(5)> 1
<Greenlet at 0x1ba58dbca48: f3(5)> 1
<Greenlet at 0x1ba58dbc948: f2(5)> 2
<Greenlet at 0x1ba58dbc948: f2(5)> 3
<Greenlet at 0x1ba58dbca48: f3(5)> 2
<Greenlet at 0x1ba58dbc948: f2(5)> 4
<Greenlet at 0x1ba58dbca48: f3(5)> 3
<Greenlet at 0x1ba58dbca48: f3(5)> 4
<Greenlet at 0x1ba58dbc648: f1(5)> 1
<Greenlet at 0x1ba58dbc648: f1(5)> 2
<Greenlet at 0x1ba58dbc648: f1(5)> 3
<Greenlet at 0x1ba58dbc648: f1(5)> 4
这种比较麻烦,如果源代码里面用到time.sleep()或者socket中的堵塞,一个一个改会很麻烦,所以有了gevent的补丁
代码:
import gevent
import time
from gevent import monkey monkey.patch_all() def f1(n):
for i in range(n):
print(gevent.getcurrent(),i)
time.sleep(1) def f2(n):
for i in range(n):
print(gevent.getcurrent(),i)
time.sleep(0.1) def f3(n):
for i in range(n):
print(gevent.getcurrent(),i)
time.sleep(0.2) # print("---1---")
# # gevent比greenlet好的地方是,遇到sleep自动切换,但是不支持time.sleep(),支持gevent.sleep()
# # 不止是sleep,但凡延时或者堵塞的东西全要换成gevent里面的
# g1 = gevent.spawn(f1,5)
# print("---2---")
# g2 = gevent.spawn(f2,5)
# print("---3---")
# g3 = gevent.spawn(f3,5)
# print("---4---")
# g1.join()
# g2.join()
# g3.join()
# 一个一个join()很麻烦,可以放到joinall()的列表中
gevent.joinall([
gevent.spawn(f1,5),
gevent.spawn(f2,5),
gevent.spawn(f3,5) ])
结果不变:
<Greenlet at 0x1a159007048: f1(5)> 0
<Greenlet at 0x1a159007248: f2(5)> 0
<Greenlet at 0x1a159007348: f3(5)> 0
<Greenlet at 0x1a159007248: f2(5)> 1
<Greenlet at 0x1a159007348: f3(5)> 1
<Greenlet at 0x1a159007248: f2(5)> 2
<Greenlet at 0x1a159007248: f2(5)> 3
<Greenlet at 0x1a159007348: f3(5)> 2
<Greenlet at 0x1a159007248: f2(5)> 4
<Greenlet at 0x1a159007348: f3(5)> 3
<Greenlet at 0x1a159007348: f3(5)> 4
<Greenlet at 0x1a159007048: f1(5)> 1
<Greenlet at 0x1a159007048: f1(5)> 2
<Greenlet at 0x1a159007048: f1(5)> 3
<Greenlet at 0x1a159007048: f1(5)> 4
多任务5-协程(IO密集型适用)--gevent完成多任务及monkey补丁的更多相关文章
- day 35 协程 IO多路复用
0.基于socket发送Http请求 import socket import requests # 方式一 ret = requests.get('https://www.baidu.com/s?w ...
- python中的协程:greenlet和gevent
python中的协程:greenlet和gevent 协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A(): ...
- 协程IO多路复用
协程:单线程下实现并发并发:伪并行,遇到IO就切换,单核下多个任务之间切换执行,给你的效果就是貌似你的几个程序在同时执行.提高效率任务切换 + 保存状态并行:多核cpu,真正的同时执行串行:一个任务执 ...
- python中协程实现的本质以及两个封装协程模块greenle、gevent
协程 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一个执行单元,因为 ...
- python协程详解,gevent asyncio
python协程详解,gevent asyncio 新建模板小书匠 #协程的概念 #模块操作协程 # gevent 扩展模块 # asyncio 内置模块 # 基础的语法 1.生成器实现切换 [1] ...
- python爬虫--多任务异步协程, 快点,在快点......
多任务异步协程asyncio 特殊函数: - 就是async关键字修饰的一个函数的定义 - 特殊之处: - 特殊函数被调用后会返回一个协程对象 - 特殊函数调用后内部的程序语句没有被立即执行 - 协程 ...
- 小爬爬4.协程基本用法&&多任务异步协程爬虫示例(大数据量)
1.测试学习 (2)单线程: from time import sleep import time def request(url): print('正在请求:',url) sleep() print ...
- (并发编程)进程池线程池--提交任务2种方式+(异步回调)、协程--yield关键字 greenlet ,gevent模块
一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用“池”:池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务 ...
- python基于协程的网络库gevent、eventlet
python网络库也有了基于协程的实现,比较著名的是 gevent.eventlet 它两之间的关系可以参照 Comparing gevent to eventlet, 本文主要简单介绍一下event ...
- Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】
一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...
随机推荐
- Elasticsearch聚合操作报错解决办法
1. 当根据一个类型为text的字段idc进行聚合操作时,查询语句如下: { "aggs": { "top_10_states": { "terms& ...
- Deepin安装前分区总结
linux的分区的概念应该这么理解,为某个目录创建/挂载分区,比如为/home创建/挂载到某个分区上: 1.需要/boot分区,1.5G: 2./分区,100G:[会自动创建其他目录如/srv,/ro ...
- [转帖]再谈IO的异步,同步,阻塞和非阻塞
再谈IO的异步,同步,阻塞和非阻塞 https://yq.aliyun.com/articles/53674?spm=a2c4e.11155435.0.0.48bfe8efHUE8wg krypt ...
- uwsgi03----直接部署
1.http 和 http-socket的使用上有一些区别: http: 自己会产生一个http进程(可以认为与nginx同一层)负责路由http请求给worker, http进程和worker之间使 ...
- STL源码剖析——iterators与trait编程#4 iterator源码
在前两节介绍了迭代器的五个相应类型,并讲述如何利用traits机制提取迭代器的类型,但始终是把iteartor_traits类分割开来讨论,这影响我们的理解,本节将给出iteator的部分源码,里面涵 ...
- 从零开始学Flask框架-005
表单 Flask-WTF 项目结构 pip install flask-wtf 为了实现CSRF 保护,Flask-WTF 需要程序设置一个密钥.Flask-WTF 使用这个密钥生成加密令牌,再用令牌 ...
- Git学习(二)——使用Git协同开发
项目协同开发git操作 基本流程 1.开发前,拉一次远程仓库 2.工作区进行开发 3.将开发结果提交到本地版本库 git status查看时没有待处理的事件 4.拉取远程仓库(每一次要提交远程仓库前必 ...
- ssh使用
上传: scp myfile.txt username@192.168.1.1:/homw/ 下载: scp username@192.168.1.5:/home/myfile.txt / ...
- Scratch(四)舞台区详解
在Scratch里面,所有的表现结果都在“舞台区”呈现,前面我们学习的“石头剪刀布”游戏,也是在“舞台区”完成的. 舞台区是非常重要的区域,所以我们今天单独用一个章节来详细说说这个舞台. 既然是一个舞 ...
- python多线程爬取斗图啦数据
python多线程爬取斗图啦网的表情数据 使用到的技术点 requests请求库 re 正则表达式 pyquery解析库,python实现的jquery threading 线程 queue 队列 ' ...