代码:

 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补丁的更多相关文章

  1. day 35 协程 IO多路复用

    0.基于socket发送Http请求 import socket import requests # 方式一 ret = requests.get('https://www.baidu.com/s?w ...

  2. python中的协程:greenlet和gevent

    python中的协程:greenlet和gevent 协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A(): ...

  3. 协程IO多路复用

    协程:单线程下实现并发并发:伪并行,遇到IO就切换,单核下多个任务之间切换执行,给你的效果就是貌似你的几个程序在同时执行.提高效率任务切换 + 保存状态并行:多核cpu,真正的同时执行串行:一个任务执 ...

  4. python中协程实现的本质以及两个封装协程模块greenle、gevent

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一个执行单元,因为 ...

  5. python协程详解,gevent asyncio

    python协程详解,gevent asyncio 新建模板小书匠 #协程的概念 #模块操作协程 # gevent 扩展模块 # asyncio 内置模块 # 基础的语法 1.生成器实现切换 [1] ...

  6. python爬虫--多任务异步协程, 快点,在快点......

    多任务异步协程asyncio 特殊函数: - 就是async关键字修饰的一个函数的定义 - 特殊之处: - 特殊函数被调用后会返回一个协程对象 - 特殊函数调用后内部的程序语句没有被立即执行 - 协程 ...

  7. 小爬爬4.协程基本用法&&多任务异步协程爬虫示例(大数据量)

    1.测试学习 (2)单线程: from time import sleep import time def request(url): print('正在请求:',url) sleep() print ...

  8. (并发编程)进程池线程池--提交任务2种方式+(异步回调)、协程--yield关键字 greenlet ,gevent模块

    一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用“池”:池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务 ...

  9. python基于协程的网络库gevent、eventlet

    python网络库也有了基于协程的实现,比较著名的是 gevent.eventlet 它两之间的关系可以参照 Comparing gevent to eventlet, 本文主要简单介绍一下event ...

  10. Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】

    一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...

随机推荐

  1. activeMq学习应用

    一.下载 ActiveMQ 5.15.0下载地址 二.安装 解压apache-activemq-5.15.0-bin.zip D:\apache-activemq-5.15.7-bin\apache- ...

  2. PHP正则匹配价格

    /** * 匹配价格 * @param $price * @return bool */ public static function checkPrice($price) { // 不能小于0 if ...

  3. 微信自研生产级paxos类库PhxPaxos实现原理介绍

    转载自:   http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483695&idx=1&sn=91ea4229 ...

  4. QT 读写.ini配置文件

    当需要存放的数据量较少时合适使用.ini配置文件. #include <QCoreApplication> #include <QSettings> void SystemSe ...

  5. Python-08-内置函数

    详情 https://docs.python.org/3/library/functions.html?highlight=built#ascii 1. abs() 取绝对值 2. all() 如果可 ...

  6. 如何将本地的项目添加到github上

    参考链接:http://note.youdao.com/noteshare?id=d0b7990a83b024b0172b6d5c5617a8d0&sub=659F216B9046420991 ...

  7. vim常用命令的使用

    中文博客:https://www.cnblogs.com/lijia0511/p/5644566.html 英文原文:http://yannesposito.com/Scratch/en/blog/L ...

  8. 从NV12中裁剪子画面注意事项

    1. 裁剪时,Y和UV的地址计算: / **** * pa_yuv_main: yuv首地址 * video_frame.loff: 行偏移量 lineoffset * VDO_SIZE_W.VDO_ ...

  9. Scratch编程与高中数学算法初步

    scratch编程与高中数学算法初步 一提到编程,大家可能觉得晦涩难懂,没有一定的英语和数学思维基础的人,一大串的编程代码让人望而步,何况是中小学生.   Scratch是一款由麻省理工学院(MIT) ...

  10. Python 操作MySQL 数据库

    Python 操作 MySQL 数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的 ...