Python手动或自动协程操作方法解析
作者:wztshine 发布时间:2023-06-30 11:38:41
标签:Python,手动,自动,协程
1.手动协程操作:
# pip install gevent
from greenlet import greenlet
def test():
print('He ')
gr2.switch() # 切换到test2
print('a ')
gr2.switch()
def test2():
print('is ')
gr1.switch()
print('student.')
gr1 = greenlet(test) # 创建一个协程
gr2 = greenlet(test2)
gr1.switch() # 切换到gr1,也就是运行它
2. 自动协程,遇到I/O自动切换
import gevent
from gevent import monkey; monkey.patch_all() # 导入monkey,给所有支持的模块打上补丁,变成非阻塞模块,也就是使其能够进行协程操作
def test1(n):
print("I'm doing my homework.")
gevent.sleep(n) # 模拟I/O操作,gevent自动切换
print('Keep doing my homework.')
def test2(n):
print("I have no time to watch TV.")
gevent.sleep(n)
print('Stop thinking!')
def test3():
print("Life is hard.")
# 等待 greenlets 全部结束
gevent.joinall([
gevent.spawn(test1,3), # 创建一个新的greeenlet对象,并规划它去执行 test1(3)
gevent.spawn(test2,1),
gevent.spawn(test3),
])
结果:
I'm doing my homework.
I have no time to watch TV.
Life is hard.
Stop thinking!
Keep doing my homework.
3. socket 协程实例:
服务器:
import socket
import gevent
from gevent import monkey
monkey.patch_all() # 打补丁,让所有支持的模块变成非阻塞的方法
def server(ip,port):
s = socket.socket() # 生成socket对象
s.bind((ip, port)) # 绑定ip和端口
s.listen() # 设置监听
while True:
cli, addr = s.accept() # 等待连接
gevent.spawn(handle_request, cli) # 对每一个连接,使用协程的方法生成greenlet
def handle_request(conn):
try:
while True:
data = conn.recv(1024) # 接收数据
print("recv:", data)
new = 'Hello '+ data.decode().title()
conn.send(new.encode('utf8')) # 返回数据
if not data:
conn.shutdown(socket.SHUT_WR)
except Exception as e:
print(e)
finally:
conn.close()
if __name__ == '__main__':
server('localhost',9999)
客户端:
import socket
client = socket.socket()
client.connect(('localhost',9999))
while True:
con = input('>>>:').strip()
if len(con) ==0: continue
client.send(con.encode('utf-8'))
data = client.recv(1024)
print(data.decode())
client.close()
来源:https://www.cnblogs.com/wztshine/p/12054120.html


猜你喜欢
- 概述SQL Server的主要性能取决于磁盘I/O效率,SQL Server 。2008提供了数据压缩功能来提高磁盘I/O效率。表压缩意味着
- 这里批量处理word文档的操作主要是通过python-docx非标准库实现的,通过定位到文档对象、再到段落、最后到一行文本从而完成针对文字对
- #/bin/sh #检测mysql server是否正常提供服务 mysqladmin -u sky -ppwd -h localhost
- 最近群里好多人讨论oracle安全问题,今天找了些资料学习了下 获取Oracle当前会话的一些属性 (对于sql注射的环境判断很有用哦) S
- you-get是github上python的一个开源库(https://github.com/soimort/you-get),使用you-
- MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1秒钟只能插入10几条
- 前言今天我们一起来聊聊DataFrame中的索引。上一篇文章当中我们介绍了DataFrame数据结构当中一些常用的索引的使用方法,比如ilo
- 首先要下载:Graphviz - Graph Visualization Software安装完成后将安装目录的bin 路径加到系统路径中,
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 在 HTML 页面中嵌入 JavaScript 脚本需要使用 <script> 标签,用户可以在 <script>
- Python对象动态的增加属性和方法前面我们了解到数据封装、继承和多态只是面向对象程序设计中最基础的3个概念。在Python中,面向对象还有
- 错误重现:首先在控制面板里卸载了sqlserver软件,一切正常,然后重启(一定要重启,否则没法重装),执行sqlserver的安装程序,一
- 一直在学习系统托盘的实现,于是自己写了一个简单的系统托盘实例,右键包括演示、最大化、最小化、退出和关于。在python2.6下测试通过。注意
- Python 正则表达式正则表达式本身是独立于编程语言的知识,但是它又依附于编程语言,基本上我们所使用的编程语言都提供了对它的实现,当然了,
- 如何做一个分页程序? 这在ASP中确实容易实现,但需要技巧,看看下面的分页代码和说明: <angu
- 一 概念1. 原理2. 好处不同项目可能用到的环境不同,运用虚拟环境能将不同环境分隔开二 virtualenvvirtual 虚拟的1. 安
- SQL Server 6.5作为面向中小型企业的网络数据库服务系统,提供了 与众多高级数据库管理器相同的运行性能,向传统的数据库厂商发起了强
- go设置GOROOT和GOPATHgo 里面有两个非常重要的环境变量 GOROOT 和 GOPATH,其中 GOROOT 是安装 go 的路
- 本文总结了python画图中使用各种特殊符号方式一、问题背景在论文中,如何使用特殊符号进行表示?这里给出效果图和代码完整代码:from ma
- 环境:Oracle 11.2.0.4 RAC(2 nodes)说明:假设新增闪存挂载点是/flash(使用了第三方的集群文件系统),如果是使