协成 gevent

greenlet可以实现协程,不过每一次都要人为的去指向下一个该执行的协程,显得太过麻烦。python还有一个比greenlet更强大的并且能够自动切换任务的模块

gevent每次遇到io操作,需要耗时等待时,会自动跳到下一个协程继续执行
执行代码
import gevent

def A():
while 1:
print(’-------A-------’)
gevent.sleep(1) #用来模拟一个耗时操作,注意不是time模块中的sleep

def B():
while 1:
print(’-------B-------’)
gevent.sleep(0.5) #每当碰到耗时操作,会自动跳转至其他协程

g1 = gevent.spawn(A) # 创建一个协程
g2 = gevent.spawn(B)
g1.join() #等待协程执行结束
g2.join()

执行结果

-------A-------
-------B-------
-------B-------
-------A-------
-------B-------
-------B-------
-------A-------
-------B-------
-------B-------

协程gevent完成回显服务器:
import gevent
from gevent import monkey,socket

monkey.patch_all() #有IO才做时需要这一句

s = socket.socket(2,1) #用的都是gevent模块中的socket,但用法一样
s.setsockopt(1,2,1)
s.bind((’’,8080))
s.listen(1024)

def func_accept():
while 1:
cs,userinfo = s.accept()
print(‘来了一个客户’+str(userinfo))
g = gevent.spawn(func_recv,cs) #每当有用户连接,增加一条协程

def func_recv(cs):
while 1:
recv_data = cs.recv(1024)
print(recv_data) #程谁堵塞了,便会跳转至其他协程
if len(recv_data) > 0:
cs.send(recv_data)
else:
cs.close()
break

g1 = gevent.spawn(func_accept)
g1.join()
gevent的代码风格和线程非常相似,运行出来后的效果也非常相似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值