gevent,触发新生成的任务运行的方式

时间:2015-06-24 08:30:19

标签: python thrift gevent

我的项目正在使用gevnet来实现一个thrift服务器,这对我来说是新的。

我正在阅读代码并从其文档中学习。下面的代码片段在我的项目中:

TSocket.socket = gevent.socket # I find this when comparing the production
                               # code and mine. It seems that this socket
                               # schedule the tasks when there are newly-spawn ones. 
                               # Could someone tell me more about it?

while True:
    try:
        client = self.serverTransport.accept()
        gevent.spawn(self._serve_client, client)
    except (SystemExit, KeyboardInterrupt):
        break
    except Exception as x:
        logging.exception(x)

产卵后,它直接完成它的工作。

但是在我自己的实现中,这是为了自学,我必须做以下事情:

while True:
    try:
        client = self.serverTransport.accept()
        gevent.spawn(self._serve_client, client)
        gevent.sleep(0)  # switch to the newly-spawn task.
                         # this makes it to process tasks one by one and
                         # this makes it non-concurrent
    except (SystemExit, KeyboardInterrupt):
        break
    except Exception as x:
        logging.exception(x)

在我的生产代码中,我还没有找到任何关于如何触发任务运行的线索。 所以我在这里要求了解在上面的服务器中运行新生成任务的方法。

1 个答案:

答案 0 :(得分:1)

在您的代码中,您必须致电gevent.sleep(0),因为没有别的 触发gevent循环。有了这个睡眠就可以恢复控制 gevent,执行衍生的greenlet。

生产代码中的行TSocket.socket = gevent.socket修补了 使用默认的thrift socket实现 改为gevent套接字; gevent套接字运行gevent循环,所以你真的 需要此修补程序才能运行代码。

没有补丁,TSocket.socket会阻塞并杀死并发 (没有OS级别的线程)。