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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。