14 并发编程-(协程)-greenlet模块&gevent模块
1、实现多个任务之间进行切换,yield、greenlet都没有实现检测I/O,greenlet在实现多任务切换下更简单

from greenlet import greenlet
def eat(name):
print(f"{name} eat 1")
g2.switch('egon') # 切换
print(f"{name} eat 2")
g2.switch()
def play(name):
print(f"{name} play 1")
g1.switch()
print(f"{name} play 2")
g1 = greenlet(eat)
g2 = greenlet(play)
g1.switch('egon') # 程序从此处执行 egon eat 1
egon play 1
egon eat 2
egon play 2

2、一个协程遇到IO操作自动切换到其它协程(如何实现检测IO,yield、greenlet都无法实现,就用到了gevent模块(select机制))
2.1 gevent模块
可以轻松的实现并发或异步编程,在gevent中用到的主要模式是Greenlet,


2.1.1、遇到io阻塞时会自动切换任务 --只实现识别gevent可以识别的阻塞
# 遇到io阻塞会自动切换任务
import gevent,time
def eat(name):
print(f"{name} eat1")
gevent.sleep(2) # 模拟io阻塞
print(f"{name} eat2")
def play(name):
print(f"{name} play1")
gevent.sleep(2)
print(f"{name} play2")
start = time.time()
g1 = gevent.spawn(eat,'alex')
g2 = gevent.spawn(play,'alex')
g1.join()
g2.join()
stop = time.time()
print(stop-start) alex eat1
alex play1
alex eat2
alex play2
2.007000207901001
2.1.2、实际情况中的应用gevent 打补丁(monkey.patch_all()) 识别 所有阻塞


alex eat1
alex play1
alex eat2
alex play2
2.005999803543091
3、基于gvent模块实现并发的套接字通信
服务端:
# 基于 gevent
from gevent import monkey;monkey.patch_all()
import socket
import gevent def Server(ip_port):
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(ip_port)
server.listen(5)
while True:
conn,addr = server.accept()
gevent.spawn(communicate,conn)
server.close()
def communicate(conn):
while True:
try:
data = conn.recv(1024).decode('utf-8')
conn.send(data.upper().encode('utf-8'))
except Exception as e:
print(e)
break
conn.close()
if __name__ == '__main__':
ip_port = ('127.0.0.1',8080)
Server(ip_port)
# g = gevent.spawn(Server,ip_port)
# g.join()
客户端:启动500个线程模拟500个客户端向服务端发消息
import socket
from threading import Thread,currentThread
def client():
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port = ('127.0.0.1',8080)
client.connect(ip_port)
while True:
client.send(f"{currentThread().getName()} hello".encode('utf-8'))
data = client.recv(1024)
print(data.decode('utf-8'))
client.close()
if __name__ == '__main__':
for i in range(500):
t = Thread(target=client)
t.start()
14 并发编程-(协程)-greenlet模块&gevent模块的更多相关文章
- 并发编程协程(Coroutine)之Gevent
并发编程协程之Gevent Gevent官网文档地址:http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate r ...
- 并发编程~~~协程~~~greenlet模块, gevent模块
一 协程 1. 协程: 单线程下的并发,又称微线程,纤程.协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 并发真正的核心: 切换并且保持状态. 开启协程并发的执行,自己的程序把控着C ...
- python 并发编程 协程 greenlet模块
一 greenlet模块 不敢是yield,还是greenlet都没有实现检测io,实现遇到io切换效果 如果我们在单个线程内有20个任务,要想实现在多个任务之间切换,使用yield生成器的方式过于麻 ...
- Python并发编程协程(Coroutine)之Gevent
Gevent官网文档地址:http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译 ...
- python 并发编程 协程 目录
python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 python 并发编程 协程 gevent模块 python 并发编程 基于gevent模块实现并发的套接字 ...
- 并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信
1.协程并发:切+保存状态单线程下实现并发:协程 切+ 保存状态 yield 遇到io切,提高效率 遇到计算切,并没有提高效率 检测单线程下 IO行为 io阻塞 切 相当于骗操作系统 一直处于计算协程 ...
- 网络编程基础--协程--greenlet切换---gevent自动识别 IO ---
协程: 1 单线程来实现并发---协程: 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程, 即协程是由用户程序自己控制调度的 只 ...
- python语法基础-并发编程-协程-长期维护
############### 协程 ############## # 协程 # 小知识点, # 协程和进程和线程一样都是实现并发的手段, # 开启一个线程,创建一个线程,还是需要开销, ...
- python 并发编程 协程池
协程池 from gevent.pool import Pool from gevent import monkey;monkey.patch_all() import gevent from gev ...
随机推荐
- JS BOM操作
Bom:浏览器对象模型(Browser Object Model,简称 BOM)提供了独立于内容而与浏览器窗口进行交互的对象.描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作 (1) ...
- 记一次生产环境axis2服务特别慢的问题。
情况如下: 某服务,在测试环境测试的时候整个响应过程也就0.5s左右,测试环境和生产环境axis2版本一致,tomcat版本一致,但是生产环境需要差不多20S. 后来,越来越慢,导致服务一起来,整个生 ...
- 《BAT前端进阶[师徒班]》学习总结
这是一个培训课 是的,这是一个面向中级前端的培训班,但明显跟传统的填鸭式培训班不太一样.这边的老师都是大牛这是毫无疑问的,而且都是一线开发人员.而且课程一开始就说明了面向了是有1-3年有工作经验的前端 ...
- MD5加密源码!
import java.security.*; class MD5{ public final static String MD5(String s){ char hexDigits[] = {'0' ...
- Bayes' theorem (贝叶斯定理)
前言 AI时代的到来一下子让人感觉到数学知识有些捉襟见肘,为了不被这个时代淘汰,我们需要不断的学习再学习.其中最常见的就是贝叶斯定理,这个定理最早由托马斯·贝叶斯提出. 贝叶斯方法的诞生源于他生前为解 ...
- LocalStorage漏洞分析
之前LocalStorage爆出过一个漏洞,使用Chrome打开这个网站:http://filldisk.com,会将磁盘空间给撑爆,而且Chrome还会Crash.除了FireFox之外,其他浏览器 ...
- java Object对象的clone方法
参考copy链接:http://blog.csdn.net/bigconvience/article/details/25025561 在看原型模式,发现要用到clone这个方法,以前和朋友聊过,没怎 ...
- Hadoop和HBase中出现 ssh登录 The authenticity of host 192.168.0.xxx can't be established.
用ssh登录一个机器(换过ip地址),提示输入yes后,屏幕不断出现y,只有按ctrl + c结束 错误是:The authenticity of host 192.168.0.xxx can't b ...
- Python3.5 源码安装 Ubuntu16.04环境
安装源码编译所需的各种依赖库:(Ubuntu16.04环境下) sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-de ...
- wpf 客户端【JDAgent桌面助手】开发详解-开篇
上周二 发表了一个帖子:wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截图... 没有想到不到一个周时间已经浏览量过8千,估计过几天就过万了..很开心啊.. 评论中好多网友问我要 ...