协程,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 ...
随机推荐
- icon moon追加字体
一.初始自定义字体为icon moon1@font-face { font-family: 'icomoon1'; src: url('fonts/icomoon1.eot?9fhn24'); src ...
- E: Sub-process /usr/bin/dpkg returned an error code (1)错误解决
在用apt-get安装软件时出现了类似于install-info: No dir file specified; try --help for more information.dpkg:处理 get ...
- C# 引用类型公共变量的影响
public int[] a =new int[2]; private void button1_Click(object sender, EventArgs e) { bing(a); } priv ...
- 剑指Offer 14. 链表中倒数第k个结点 (链表)
题目描述 输入一个链表,输出该链表中倒数第k个结点. 题目地址 https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?t ...
- Windows10 64位安装TensorFlow-GPU
TensorFlow有GPU版和CPU版. GPU版需要CUDA和cuDNN支持,到链接:https://developer.nvidia.com/cuda-gpus 确认自己的显卡是否支持CUDA. ...
- ssh: connect to host gitlab.alpha.com port 22: Network is unreachable
在这里只说明我遇到的问题和解决方法,可能并不能解决你遇到的问题: git clone git@gitlab.alpha.com:ipcam/ambarella.gitCloning into 'amb ...
- 类Shiro权限校验框架的设计和实现
前言: 之前简单集成了springmvc和shiro用于后台管理平台的权限控制, 设计思路非常的优美, 而且编程确实非常的方便和简洁. 唯一的不足, 我觉得配置稍有些繁琐. 当时我有个小想法, 觉得可 ...
- MacBook使用笔记2 - 安装windows虚拟机攻略
转载请标注原链接:http://www.cnblogs.com/xczyd/p/5498878.html 5月初从阿里滚粗,然后失去了公司发的Mac Air.说实话Mac机器确实比windows好用一 ...
- 微信小程序传值以及获取值方法
http://www.51xuediannao.com/xiaochengxu/xiaochengxu-chuanzhi.html
- day05 集合
今日进度(数据类型) 集合 内存相关 深浅拷贝 1.集合表示 1.无序 2.不重复 3.hash查找 #问题:v={}表示? set: v1=set()#空集合 v1={1,2,3,4,5} dict ...