协程,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 ...
随机推荐
- web.xml配置说明
前言 首先,web.xml文件的作用是配置web项目启动时加载的信息.(web.xml并不是一个Web的必要文件,没有web.xml,网站仍然是可以正常工作的.) 而这些配置自然是通过标签来实现的, ...
- linux下使用命令修改IP地址
使用root用户登录进入Linux,打开进去终端 在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0 (最后的eth0是网卡名,我的是Auto_et ...
- SQL Server--------SQL Server问题错误解决
1.错误提示: 修改字段属性时,提示: 消息 5074,级别 16,状态 1,第 1 行对象'DF__dms_deliv__sync___51BAE991' 依赖于 列'sync_ff_result_ ...
- keras 实现人工神经网络
#encoding=utf-8 import numpy as np from keras.models import Sequential from keras.layers import Dens ...
- ios 中pickerView城市选择和UIDatePicker生日选择
代码详见压缩包
- C# 开发ModBus的服务器程序 实现ModBus数据总站 搭建自定义的Modbus服务器 同时支持tcp和rtu
前言 本文将使用一个NuGet公开的组件技术来实现一个ModBus TCP的服务器端数据引擎,方便的实现接收来自各种设备的数据.并且该服务器模拟真实的设备,包含了数据池功能,可以接受来自任何支持Mod ...
- 框架tensorflow2
TensorFlow 2 TensorFlow 激励函数 TensorFlow 添加层: 思考:matmul和multiply两种乘法的区别:http://www.soaringroad.com/?p ...
- Unity用GUI绘制Debug/print窗口/控制台-打包后测试
Unity游戏视窗控制台输出 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...
- CCF-20170903-JSON查询
这道题当时考ccf,五道题中做的时间最长的一道题....可惜最好只有0分!! 后来重现写了一下--(110行超级麻烦 主要思想:就是先对括号经行匹配,创建的时候分为创建表和创建元素两种情况,难点在于对 ...
- SharpDevelope 在 Windows 7 SP1 with .net framework4.0 下编译时找不到resgen.exe 解决办法
如果在vs下编译正常,在SharpDevelope下编译报这个错误,可以更改编译时的.netframework版本和C#版本.在 Tool->Project Upgrade 进行项目转换后,一般 ...