使用 gevent 接收调用
recv call using gevent
我不得不通过
同时执行多个函数调用
gevent.spawn(recv)
因此,如果在一个 recv(spawn) 中,一个函数正在等待响应,另一个 recv spawn 线程已启动但使其在执行第二个函数时阻塞
def recv(*args, **kwargs):
while 1:
try:
return client_socket_fd.recv((args[0]))
except Exception, e:
err = e.args[0]
if err == errno.EAGAIN or err == errno.EWOULDBLOCK:
sleep(1)
print 'No data available'
continue
else:
break
我们该如何进行?
协程(gevent 使用协程而不是线程),将'yield' 到另一个协程进行各种调用。这包括调用 gevent 版本 函数,例如 sleep
、recv
。
为了调用正常的socket/IO/timing代码并让gevent正常工作,你需要monkey_patch这段代码。这意味着调用一个 gevent 函数,用它自己的版本替换内置的 Python 模块。通常,您想要 运行
from gevent import monkey; monkey.patch_all()
在代码的开头。这避免了一些代码已经开始使用原始套接字或文件代码,然后代码在操作完成之前更改的奇怪错误。
我不得不通过
同时执行多个函数调用gevent.spawn(recv)
因此,如果在一个 recv(spawn) 中,一个函数正在等待响应,另一个 recv spawn 线程已启动但使其在执行第二个函数时阻塞
def recv(*args, **kwargs):
while 1:
try:
return client_socket_fd.recv((args[0]))
except Exception, e:
err = e.args[0]
if err == errno.EAGAIN or err == errno.EWOULDBLOCK:
sleep(1)
print 'No data available'
continue
else:
break
我们该如何进行?
协程(gevent 使用协程而不是线程),将'yield' 到另一个协程进行各种调用。这包括调用 gevent 版本 函数,例如 sleep
、recv
。
为了调用正常的socket/IO/timing代码并让gevent正常工作,你需要monkey_patch这段代码。这意味着调用一个 gevent 函数,用它自己的版本替换内置的 Python 模块。通常,您想要 运行
from gevent import monkey; monkey.patch_all()
在代码的开头。这避免了一些代码已经开始使用原始套接字或文件代码,然后代码在操作完成之前更改的奇怪错误。