【问题标题】:recv call using gevent使用 gevent 调用 recv
【发布时间】:2017-09-14 09:06:47
【问题描述】:

我不得不同时执行多个函数调用

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    

我们该如何进行呢?

【问题讨论】:

标签: python python-2.7 gevent


【解决方案1】:

协程(gevent 使用协程而不是线程)将在各种调用中“让步”给另一个协程。这包括调用函数的gevent 版本,例如sleeprecv

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

from gevent import monkey; monkey.patch_all()

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

【讨论】:

  • 所以通过使用这些猴子补丁,我们可以同时运行 recv 调用而不会被另一个阻塞?我添加了这个猴子代码补丁,但我仍然被另一个 recv 调用阻塞。
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 2018-12-22
  • 2014-09-26
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
相关资源
最近更新 更多