Python手动或自动协程操作方法解析
1.手动协程操作:
#pipinstallgevent
fromgreenletimportgreenlet
deftest():
print('He')
gr2.switch()#切换到test2
print('a')
gr2.switch()
deftest2():
print('is')
gr1.switch()
print('student.')
gr1=greenlet(test)#创建一个协程
gr2=greenlet(test2)
gr1.switch()#切换到gr1,也就是运行它
2.自动协程,遇到I/O自动切换
importgevent
fromgeventimportmonkey;monkey.patch_all()#导入monkey,给所有支持的模块打上补丁,变成非阻塞模块,也就是使其能够进行协程操作
deftest1(n):
print("I'mdoingmyhomework.")
gevent.sleep(n)#模拟I/O操作,gevent自动切换
print('Keepdoingmyhomework.')
deftest2(n):
print("IhavenotimetowatchTV.")
gevent.sleep(n)
print('Stopthinking!')
deftest3():
print("Lifeishard.")
#等待greenlets全部结束
gevent.joinall([
gevent.spawn(test1,3),#创建一个新的greeenlet对象,并规划它去执行test1(3)
gevent.spawn(test2,1),
gevent.spawn(test3),
])
结果:
I'mdoingmyhomework.
IhavenotimetowatchTV.
Lifeishard.
Stopthinking!
Keepdoingmyhomework.
3.socket协程实例:
服务器:
importsocket
importgevent
fromgeventimportmonkey
monkey.patch_all()#打补丁,让所有支持的模块变成非阻塞的方法
defserver(ip,port):
s=socket.socket()#生成socket对象
s.bind((ip,port))#绑定ip和端口
s.listen()#设置监听
whileTrue:
cli,addr=s.accept()#等待连接
gevent.spawn(handle_request,cli)#对每一个连接,使用协程的方法生成greenlet
defhandle_request(conn):
try:
whileTrue:
data=conn.recv(1024)#接收数据
print("recv:",data)
new='Hello'+data.decode().title()
conn.send(new.encode('utf8'))#返回数据
ifnotdata:
conn.shutdown(socket.SHUT_WR)
exceptExceptionase:
print(e)
finally:
conn.close()
if__name__=='__main__':
server('localhost',9999)
客户端:
importsocket
client=socket.socket()
client.connect(('localhost',9999))
whileTrue:
con=input('>>>:').strip()
iflen(con)==0:continue
client.send(con.encode('utf-8'))
data=client.recv(1024)
print(data.decode())
client.close()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。