协程,greenlet,gevent
""" 协程 """
'''
协程: 类似于一个可以暂停的函数,可以多次传入数据,可以多次返回数据
协程是可交互的
耗资源大小:进程 --> 线程(微进程) --> 协程(微线程)
协程完成通信:生产者与消费者模式--(进程/线程/协程间通信)都可实现
进程/线程/协程 三者之间的关系:
多进程是重开进程
多线程是在进程中开启
协程是在一个进程中的一个线程中开启
协程的执行单元就是函数,(从执行单元上属于并发,对于整个服务器来说并不是)
如果协程阻塞,那么整个进程(线程)也会被阻塞。任意时刻只有一个协程在执行
协程不能避开阻塞, 通过异步的方式避开阻塞
'''
from random import randint
from time import sleep def producer(generator):
while True:
task = randint(1, 100)
generator.send(task)
print('生产了一个任务:', task)
sleep(2) def consumer():
while True:
task = (yield)
print('消费了一个任务:', task) if __name__ == '__main__':
generator = consumer()
next(generator) # 启动生成器, 是consumer阻塞在yield, 才能执行producer中的send方法
producer(generator)
greenlet: 原生的协程包 pip3 install greenlet
价值一:高性能的原生协程
价值二:语义更加明确的显示切换
价值三:直接将函数包装成协程,保持代码风格
''' greenlet协程 '''
from greenlet import greenlet from random import randint def producer():
""" 生产者 """
while True:
item = randint(1, 100)
c.switch(item) # 阻塞并 (转换发送数据)到consumer
print('生产了一个任务:', item) def consumer():
""" 消费者 """
while True:
item = p.switch() # 阻塞并转换到producer
print('消费了一个任务:', item) if __name__ == '__main__':
p = greenlet(producer)
c = greenlet(consumer)
c.switch() # 启动consumer
'''
switch转换工作单元(函数producer和consumer)
'''
gevent:
gevent = epoll(可避开阻塞) + greenlet(不可避开阻塞)
价值一:使用基于epoll的libev来避开阻塞
价值二:使用基于greenlet的高效协程来切换执行
价值三:只有遇到阻塞的时候切换,没有轮询的开销,也没有线程的开销
""" gevent = epoll(可避开阻塞) + greenlet(不可避开阻塞) """
from gevent import monkey; monkey.patch_all() # 猴子补丁, 将socket替换成epoll封装的socket
from gevent.queue import Queue # gevent封装的队列
from random import randint
from time import sleep import socket
import gevent def producer():
while True:
item = randint(0, 100)
queue.put(item)
print('生产了一个任务:', item)
sleep(1) def consumer():
while True:
item = queue.get()
print('消费了一个任务:', item)
sleep(3) def my_worker():
while True:
conn, addr = server.accept()
recv_data = conn.recv(1024)
if recv_data:
conn.send(recv_data)
else:
conn.close()
break server = socket.socket()
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('', 8000))
server.listen(1000) queue = Queue(3) p = gevent.spawn(producer) # 协程化
c = gevent.spawn(consumer)
# 等待所有协程结束
gevent.joinall(
[p, c]
)
协程,greenlet,gevent的更多相关文章
- python 协程 greenlet gevent
一.并发的本质 切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长时间片到了 二.协程 ...
- 线程队列 concurrent 协程 greenlet gevent
死锁问题 所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...
- day 34 线程队列 线程池 协程 Greenlet \Gevent 模块
1 线程的其他方法 threading.current_thread().getName() 查询当前线程对象的名字 threading.current_thread().ident ...
- 协程,greenlet原生协程库, gevent库
协程简介 协程(coroutine),又称为微线程,纤程,是一种用户级的轻量级线程.协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来时,恢复之前保存的上下文 ...
- 【python】-- 协程介绍及基本示例、协程遇到IO操作自动切换、协程(gevent)并发爬网页
协程介绍及基本示例 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他 ...
- 并发编程(六)——进程/线程池、协程、gevent第三方库
进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...
- python 线程(其他方法,队列,线程池,协程 greenlet模块 gevent模块)
1.线程的其他方法 from threading import Thread,current_thread import time import threading def f1(n): time.s ...
- 协程greenlet、gevent
greenlet为了更好使用协程来完成多任务,python中greenlet模块对其封装,从而使得切换任务变得更加简单安装方式 pip3 install greenlet 示例代码: from gre ...
- 协程----greenlet模块,gevent模块
1.协程初识,greenlet模块 2.gevent模块(需要pip安装) 一.协程初识,greenlet模块: 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线 ...
- 14 并发编程-(协程)-greenlet模块&gevent模块
1.实现多个任务之间进行切换,yield.greenlet都没有实现检测I/O,greenlet在实现多任务切换下更简单 from greenlet import greenlet def eat(n ...
随机推荐
- centos7 操作防火墙
原文:https://blog.csdn.net/u012498149/article/details/78772058 1.firewalld的基本使用 启动: systemctl start fi ...
- Core Json 序列化相关问题
//返回json 大小写 配置 services.AddMvc() .AddJsonOptions( op => op.Serial ...
- webapp 安卓 ios 兼容性问题
1.ios js中时间不兼容YYYY-MM-DD这种格式的时间,只支持YYYY/MM/DD这种格式 // 在safari中new Date('2018-09-02') // Invalid Daten ...
- Makefile 中 -rpath -rpath-link
-rpath和-rpath-link 假设有3个文件,在同一目录下,有这样的依赖关系 test->liba.so->libd.so 如果编译test的时候这样写 gcc test.c –l ...
- Couldn't find preset "es2015" relative to directory问题解决
由于是菜鸟没使用ES标准,而引入的vue-ueditor使用了ES标准,所以编译会报错,解决办法如下: npm install babel-preset-es2015 --save-dev 然后需要在 ...
- yum 的 group的信息
查找 yum源中有哪些group及其详细信息 1:yum groupinfo '*' | less 2:yum groupinfo '*' | less +/sendmail-cf 将 sendmai ...
- elasticsearch 拼音检索能力研究
gitchennan/elasticsearch-analysis-lc-pinyin 配置参数少,功能满足需求. 对应版本 elasticsearch2.3.2 对应 elasticsearch-a ...
- Java多线程入门中几个常用的方法
一.currentThread()方法 currentThread方法就是返回当前被调用的线程. 该方法为一个本地方法,原码如下: /** * Returns a reference to the c ...
- Windows下运行Linux命令
安装Gow软件,Gow-0.7.0.exe,这样就可以在Windows命令行运行Linux命令,比如通过scp把Windows下的文件拷贝到Linux下. 直接运行安装,不会生成任何客户端,直接使用W ...
- CCF-20170903-JSON查询
这道题当时考ccf,五道题中做的时间最长的一道题....可惜最好只有0分!! 后来重现写了一下--(110行超级麻烦 主要思想:就是先对括号经行匹配,创建的时候分为创建表和创建元素两种情况,难点在于对 ...