# pip 装模块   greenlet和gevent

# 协程
# 与进程、线程一样也是实现并发的手段
# 创建一个线程、关闭一个线程都需要创建寄存器、栈等、需要消耗时间 # 协程本质上是一个线程
# 能够在多个任务之间切换来节省一些IO时间
# 协程中任务之间的切换时间开销,要远远小于进程或线程之间的切换 # 4CPU中,进程一般创建4+1个进程 + 一个进程中线程为4*5 + 一个线程中创建500个协程,一般这是一台4CPU的机器电脑上能达到好的效率的并发程度,50000个并发。nginx这种负载均衡的东西就是这种思路 #
# def cosumer():
# '''
# 生成器函数:
# :return:
# '''
# while 1:
# x = yield
# print('处理消费了数据', x)
#
#
# if __name__ == '__main__':
# c = cosumer() # 得到生成器
# next(c) # 走到生成器函数中的第一个yield
# c.send(2) # 将2给了生成器函数中的x并执行print然后又到了yield那 # # 在一个函数中控制另外一个函数,让这两个函数来回切换执行,下面用的是生成器实现的。协程效果
# def cosumer():
# '''
# 生成器函数:
# :return:
# '''
# while 1:
# x = yield
# print('处理消费了数据', x)
#
# def producer():
# c = cosumer()
# next(c)
# for i in range(10):
# print('生产了数据', i)
# c.send(i)
#
# if __name__ == '__main__':
# producer() # 真正的协程实现任务之间的切换.
# 真正的协程模块就是使用greenlet完成的任务之间的切换。省去了IO时间,当一个任务发生IO时,肯定会阻塞,此时这个时候去切换任务让另一个任务工作,另一个任务工作切换回来时,这个任务的IO时间正好结束,这就是协程想达到的效果,节省IO的切换时间
# import time
# from greenlet import greenlet
#
# def eat():
# print('eating start')
# g2.switch() # 切换到play中执行
# print('eating end')
#
# def play():
# print('playing start')
# g1.switch() #切换到eat中执行
#
# g1 = greenlet(eat) # eat任务放到greenlet中
# g2 = greenlet(play) # play任务放到greenlet中
# g1.switch() # 切换到eat任务执行到g2.switch()
# # 打印信息为
# # eating start
# # playing start
# # eating end
#
# # Process finished with exit code 0 # gevent模块
# import gevent
#
# def eat():
# print('eating start')
# gevent.sleep(1) # 发生IO阻塞,切换到play
# print('eating end')
#
# def play():
# print('playing start')
# gevent.sleep(1) # 发生IO阻塞,切换到eat
#
# g1 = gevent.spawn(eat)
# g2 = gevent.spawn(play)
# g1.join() # 因为是异步的,如果不调用join,则直接执行到了下面,这样主进程就会结束,这里阻塞等待协程的结束
# g2.join() # gevent模块
# 协程,在一个线程中来回的切换。这个切换过程不是操作系统做的,而是gevent做的
# 在这个patch_all后面的所有模块中,发生的阻塞都会有gevent的效果
# #from gevent import monkey;monkey.patch_all()
# import time
# import gevent
#
# def eat():
# print('eating start')
# time.sleep(1) # 发生IO阻塞,切换到play.因为有了mokey.patch_all所以这里等同于gevent.sleep(1),遇见IO就会切换
# print('eating end')
#
# def play():
# print('playing start')
# time.sleep(1) # 发生IO阻塞,切换到eat
# print('playing end')
#
# if __name__ == '__main__':
# g1 = gevent.spawn(eat)
# g2 = gevent.spawn(play)
# g1.join() # 阻塞等待协程执行结束
# g2.join() # # 协程任务之间的切换由程序代码(gevent)完成,只有遇到协程模块能识别到的IO操作的时候,程序才会进行协程切换,实现并发的效果 # 同步和异步(协程实现)
from gevent import monkey;monkey.patch_all() #猴子补丁,必须放到最前面,这样所有模块中的方法发生了IO阻塞时,就会触发协程的切换
import time
import gevent def task():
time.sleep(1)
print(12345) def sync():
for i in range(2):
task() def async():
g_lst = []
for i in range(10):
g = gevent.spawn(task) # 创建协程
g_lst.append(g)
gevent.joinall(g_lst) # 阻塞等待协程完毕 async() # 异步的打印12345

  协程:能够在一个线程中实现并发效果的概念,能够巧妙的利用任务中的IO阻塞时间,在任务的执行过程中,检测到IO操作时就能够协程切换到别的任务中运行

协程gevent模块和猴子补丁的更多相关文章

  1. 协程:gevent模块,遇到i/o自动切换任务 038

    协程 : gevent模块,遇到io自动切换任务 from gevent import monkey;monkey.patch_all() # 写在最上面 这样后面的所有阻塞就全部能够识别了 impo ...

  2. python编程中的并发------协程gevent模块

    任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...

  3. 协程--gevent模块(单线程高并发)

    先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行.这种 ...

  4. python之协程gevent模块

    Gevent官网文档地址:http://www.gevent.org/contents.html 进程.线程.协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩 ...

  5. python 并发编程 协程 gevent模块

    一 gevent模块 gevent应用场景: 单线程下,多个任务,io密集型程序 安装 pip3 install gevent Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步 ...

  6. 协程----greenlet模块,gevent模块

    1.协程初识,greenlet模块 2.gevent模块(需要pip安装) 一.协程初识,greenlet模块: 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线 ...

  7. 什么是协程(第三方模块gevent--内置模块asyncio)

    目录 一:协程 1.什么是协程? 2.携程的作用? 3.安装第三方模块:在命令行下 二:greenlet模块(初级模块,实现了保存状态加切换) 三: gevent模块(协程模块) 1.time 模式协 ...

  8. 线程回调,线程中的队列,事件,greenlet模块,gevent模块,自定义补丁, 单线程实现并发,协程

    1.线程回调 在线程池/进程池每次提交任务,都会返回一个表示任务的对象,Future对象Future对象具备一个绑定方法,add_done_callback 用于指定回调函数 add 意味着可以添加多 ...

  9. 14 并发编程-(协程)-greenlet模块&gevent模块

    1.实现多个任务之间进行切换,yield.greenlet都没有实现检测I/O,greenlet在实现多任务切换下更简单 from greenlet import greenlet def eat(n ...

随机推荐

  1. WebSocket的理解

    Websocket相对于无状态的HTTp协议,是在一次成功连接之后,在关闭请求之前,服务器和客户端能顺利进行信息传输.而不用像HTTP那样每一次都要告诉服务器这个请求者是谁(身份鉴别信息). 在HTT ...

  2. Vue踩坑日记-You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the next line. Use /* eslint-disable */ to ignore all warnings in a file.

    记录时间:2019年4月24日16:55:54 在build/webpack.base.conf.js文件中,注释或者删除掉:module->rules中有关eslint的规则

  3. linux 查看nginx的安装路径等信息

    做个随笔,记录一下. 想查看nginx的配置文件,但不知道nginx是安装在哪个目录下? ps -ef | grep nginx Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的 ...

  4. Vue中封装axios组件实例

    首先要创建一个网络模块network文件夹  里面要写封装好的几个组件 在config.js里面这样写 在index.js要这样写 core.js文件里面内容如下 然后要在main.js文件里面要设置 ...

  5. 通过代码实现 `OutOfMemory

    通过代码实现 OutOfMemory Intro 来尝试写一个发生 OutOfMemoryException 的代码吧,开启煞笔代码第三篇 -- OutofMemory OutOfMemory Out ...

  6. [SuProxy]Ngnix+Lua 实现SSH2,LDAP,ORACLE,SQLSERVER等TCP/IP协议分析,劫持,代理,会话及负载

    目录 目录 目录 前言 介绍 安装 下载并拷贝 使用LuaRocks安装 运行测试 使用简介 处理器(processor)创建 通道(channel)创建 负载均衡 会话信息和会话管理 Event H ...

  7. DLL转存为IL文件及修改后重新生成DLL文件

    DLL反编译工具有:dotPeek (jetbrains) .ILSpy DLL转存IL使用:ildasm 打开DLL文件,选择file->dump. il .res重新生成DLL工具: ila ...

  8. 配置交换机之间直连链路聚合-LACP模式

    组网图形 LACP模式链路聚合简介 以太网链路聚合是指将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的.链路聚合分为手工模式和LACP模式. LACP模式需要有链路聚合控制协 ...

  9. Java学习的第十九天

    1.今天学了接口只能有抽象的常量和方法,接口为interface    承接接口是implements 接口的使用 接口中的方法必须是抽象的,没有构造方法 2.今天没有问题 3.明天学习第六章综合实例 ...

  10. 【新阁教育】S7.NET+Log4Net+SQLSugar+MySQL搭建Iot平台

    1.搭建西门子S7仿真环境 新阁教育提醒您基于PLCSIM-Advanced搭建西门子S7仿真环境注意事项: 1.通过dotNet工控上位机公众号后台发送PLCSIM-Advanced获取软件 2.安 ...