""" 协程 """
'''
协程: 类似于一个可以暂停的函数,可以多次传入数据,可以多次返回数据
协程是可交互的
耗资源大小:进程 --> 线程(微进程) --> 协程(微线程)
协程完成通信:生产者与消费者模式--(进程/线程/协程间通信)都可实现
进程/线程/协程 三者之间的关系:
多进程是重开进程
多线程是在进程中开启
协程是在一个进程中的一个线程中开启
协程的执行单元就是函数,(从执行单元上属于并发,对于整个服务器来说并不是)
如果协程阻塞,那么整个进程(线程)也会被阻塞。任意时刻只有一个协程在执行
协程不能避开阻塞, 通过异步的方式避开阻塞
'''
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的更多相关文章

  1. python 协程 greenlet gevent

    一.并发的本质 切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长时间片到了 二.协程 ...

  2. 线程队列 concurrent 协程 greenlet gevent

    死锁问题 所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...

  3. day 34 线程队列 线程池 协程 Greenlet \Gevent 模块

    1 线程的其他方法 threading.current_thread().getName()    查询当前线程对象的名字 threading.current_thread().ident      ...

  4. 协程,greenlet原生协程库, gevent库

    协程简介 协程(coroutine),又称为微线程,纤程,是一种用户级的轻量级线程.协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来时,恢复之前保存的上下文 ...

  5. 【python】-- 协程介绍及基本示例、协程遇到IO操作自动切换、协程(gevent)并发爬网页

    协程介绍及基本示例 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他 ...

  6. 并发编程(六)——进程/线程池、协程、gevent第三方库

    进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...

  7. python 线程(其他方法,队列,线程池,协程 greenlet模块 gevent模块)

    1.线程的其他方法 from threading import Thread,current_thread import time import threading def f1(n): time.s ...

  8. 协程greenlet、gevent

    greenlet为了更好使用协程来完成多任务,python中greenlet模块对其封装,从而使得切换任务变得更加简单安装方式 pip3 install greenlet 示例代码: from gre ...

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

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

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

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

随机推荐

  1. web.xml配置说明

    前言 首先,web.xml文件的作用是配置web项目启动时加载的信息.(web.xml并不是一个Web的必要文件,没有web.xml,网站仍然是可以正常工作的.) 而这些配置自然是通过标签来实现的, ...

  2. linux下使用命令修改IP地址

    使用root用户登录进入Linux,打开进去终端 在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0 (最后的eth0是网卡名,我的是Auto_et ...

  3. SQL Server--------SQL Server问题错误解决

    1.错误提示: 修改字段属性时,提示: 消息 5074,级别 16,状态 1,第 1 行对象'DF__dms_deliv__sync___51BAE991' 依赖于 列'sync_ff_result_ ...

  4. keras 实现人工神经网络

    #encoding=utf-8 import numpy as np from keras.models import Sequential from keras.layers import Dens ...

  5. ios 中pickerView城市选择和UIDatePicker生日选择

    代码详见压缩包

  6. C# 开发ModBus的服务器程序 实现ModBus数据总站 搭建自定义的Modbus服务器 同时支持tcp和rtu

    前言 本文将使用一个NuGet公开的组件技术来实现一个ModBus TCP的服务器端数据引擎,方便的实现接收来自各种设备的数据.并且该服务器模拟真实的设备,包含了数据池功能,可以接受来自任何支持Mod ...

  7. 框架tensorflow2

    TensorFlow 2 TensorFlow 激励函数 TensorFlow 添加层: 思考:matmul和multiply两种乘法的区别:http://www.soaringroad.com/?p ...

  8. Unity用GUI绘制Debug/print窗口/控制台-打包后测试

    Unity游戏视窗控制台输出 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

  9. CCF-20170903-JSON查询

    这道题当时考ccf,五道题中做的时间最长的一道题....可惜最好只有0分!! 后来重现写了一下--(110行超级麻烦 主要思想:就是先对括号经行匹配,创建的时候分为创建表和创建元素两种情况,难点在于对 ...

  10. SharpDevelope 在 Windows 7 SP1 with .net framework4.0 下编译时找不到resgen.exe 解决办法

    如果在vs下编译正常,在SharpDevelope下编译报这个错误,可以更改编译时的.netframework版本和C#版本.在 Tool->Project Upgrade 进行项目转换后,一般 ...