使用gevent进行recv调用

时间:2017-09-14 09:06:48

标签: python python-2.7 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    

我们如何处理?

1 个答案:

答案 0 :(得分:0)

协程(gevent使用协程而不是线程)将会产生'各种电话的另一个协程。这包括调用 sleeprecv等函数的gevent版

为了调用正常的套接字/ IO /定时代码并使gevent正常工作,您需要 monkey_patch 此代码。这意味着调用gevent函数,用自己的版本替换内置的Python模块。通常,您想要运行

from gevent import monkey; monkey.patch_all()

代码的最开始。这避免了一些奇怪的错误,其中一些代码已经开始使用vanilla套接字或文件代码,然后在操作完成之前代码发生了变化。