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
0
投稿
猜你喜欢
- 1. 自己用python写了一个签到脚本经过测试已经可以成功打卡,于是研究了一下windows定时运行程序2. 创建定时任务2.1 打开“控
- 【简 介】熟悉网页设计的网友就知道,调用Style的方法很多,我们可以单击鼠标右键选择Custon Style来调用Style标准,也可以在
- 1.Django的简介Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Djang
- 生活形态(Life-Style)的概念源自社会学与心理学,六十年代即有学者正式引用到市场营销领域,并运用其心理影射与多维度等特质,着力解释人
- 在matplotlib中,errorbar方法用于绘制带误差线的折线图,基本用法如下plt.errorbar(x=[1, 2, 3, 4],
- Python由Guido Van Rossum发明于90年代初期,是目前最流行的编程语言之一,因其语法的清晰简洁我爱上了Python,其代码
- 操作实现函数: 代码如下:Function AddWater(n) Set Photo = 
- 前言:Python主要有三种数据类型:字典、列表、元组。其分别由花括号,中括号,小括号表示。如:字典:dic={'a':12
- 之前有写过一篇浏览器的tab设计,这回说说网站的tab设计。一说到tab很自然地就想到了导航、信息架构。随着网站信息结构的复杂化,选择tab
- input() 的用法Python3.x 中input() 函数接受一个标准输入数据,返回为 string 类型。python3将input
- 近期公司准备开发一个计费项目,数据库当然还是选用我最信赖的Oracle了。由于一部分基础数据在一台Win2000 Server的S
- Python 用了好长一段时间了,起初是基于对爬虫的兴趣而接触到的。随着不断的深入,慢慢的转了其它语言,毕竟工作机会真的太少了。很多技能长时
- 对Python字符串,除了比较老旧的%,以及用来替换掉%的format,及在python 3.6中加入的f这三种格式化方法以外,还有可以使用
- 分组小括号() 有直接分组和命名分组直接分组: ()分组只显示小括号括起来的内容re.findall(r"(name)+
- 实现对图像进行简单的高斯去噪和椒盐去噪。代码如下:import numpy as npfrom PIL import Imageimport
- 1 使用Flask处理表单什么是表单(Form)? 表单是搜集用户数据信息的各种表单元素的集合区域。它的作用是实现用户和服务器的数据交互。通
- 一步步教你怎么用Python画雪人,进一步熟悉Python的基础画图操作,废话不多说,上代码。希望您给个关注给个赞,也算对我们的支持了。cl
- 目录用Python写一个简单的通讯录一、构思1、定义空列表和一个空字典来存储2、定义功能选项3、添加通讯录功能4、 循环,调用所有的函数功能
- 和大多数的语言脚本一样,学习ASP最好的方法就是亲身尝试ASP,使用你自己的系统安装PWS或者IIS。你可以边学习边在你自己的服务器上测试A
- MySQL中模式就是数据库SHOW DATABASES;show databases;罗列所有数据库名称CREATE DATABASE &l