使用 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 版本 函数,例如 sleeprecv

为了调用正常的socket/IO/timing代码并让gevent正常工作,你需要monkey_patch这段代码。这意味着调用一个 gevent 函数,用它自己的版本替换内置的 Python 模块。通常,您想要 运行

from gevent import monkey; monkey.patch_all()

在代码的开头。这避免了一些代码已经开始使用原始套接字或文件代码,然后代码在操作完成之前更改的奇怪错误。