多任务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 ...
随机推荐
- 有助提升编程的几个Python 技巧
一行代码定义List 定义某种列表时,写For 循环过于麻烦,幸运的是,Python有一种内置的方法可以在一行代码中解决这个问题. 下面是使用For循环创建列表和用一行代码创建列表的对比. x = [ ...
- Prometheus入门到放弃(1)之Prometheus安装部署
规划: IP 角色 版本 10.10.0.13 prometheus-server 2.10 10.10.0.11 node_exporter 0.18.1 10.10.0.12 node_expor ...
- java当中JDBC当中请给出一个SQLServer DataSource and SingleTon例子
[学习笔记] 5.SQLServer DataSource and SingleTon: import net.sourceforge.jtds.jdbcx.*;import java.sql.*;i ...
- Linux基础-13-源码安装软件包
1.准备 安装必要软件 yum install gcc-* glibc-* -y yum groupinstall '开发工具' -y 2.解包 tar xvf 包名 3.运行configure脚本, ...
- flannel overlay网络浅析
Flannel基于UDP的网络实现 container-1的route表信息如下(b1): default via 100.96.1.1 dev eth0 100.96.1.0/24 dev eth0 ...
- [LOJ 6485]LJJ学二项式定理(单位根反演)
也许更好的阅读体验 \(\mathcal{Description}\) 原题链接 \(T\)组询问,每次给\(n,s,a_0,a_1,a_2,a_3\)求 \(\begin{aligned}\left ...
- Eclipse RCP难点:给Command传递参数(Object)
这个问题网络上没有答案,国外网站上也没有,本人研究了一天,终于搞明白如何实现,实际上是Eclipse RCP的ICommandService本身就已经提供的方法,只是网络上教的都是使用IHandler ...
- 什么是RAID(磁盘阵列)
RAID全称Redundant Array of Independent Disk,即独立冗余磁盘阵列.RAID技术由加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同 ...
- easyExcel用于导入导出
1.添加依赖: <!-- 现在已经更新到1.1.2-beta5 --> <dependency> <groupId>com.alibaba</groupId& ...
- C# async 和 await 理解
C# async 和 await 理解 先假设如下场景: 主函数 Main,循环等待用户输入: 计算函数 Cal,耗时计算大量数据: class Test { static int Main(stri ...