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

Python gevent,触发新生成任务运行的方法,python,thrift,gevent,Python,Thrift,Gevent,我的项目是使用gevnet来实现一个thrift服务器,这对我来说是新的 我正在阅读代码并从其文档中学习。下面的代码段在我的项目中: TSocket.socket = gevent.socket # I find this when comparing the production # code and mine. It seems that this socket # s

我的项目是使用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)
在我的生产代码中,我没有找到任何关于如何触发任务运行的线索。
因此,我在这里想了解一下在上面的服务器中运行新生成任务的方法。

在代码中,您必须调用
gevent.sleep(0)
,因为没有其他方法 触发gevent循环。有这样的睡眠可以让你重新控制自己 gevent,它执行生成的greenlet

生产代码中的行
TSocket.socket=gevent.socket
用于修补 要使用的默认thrift套接字实现 一个gevent插座代替;gevent套接字运行gevent循环,因此 需要此修补程序才能运行代码

如果没有补丁,
TSocket.socket
将阻塞并终止并发
(没有操作系统级线程)。

您的意思是,在代码补丁之后,gevent.socket将监视gevent循环。一旦有一个新产卵的绿豆,它会安排它运行?不完全是这样。我的意思是,只要gevent套接字处于“活动”状态,即它正在接收或发送数据,gevent循环就会运行。例如,如果一个套接字在接收呼叫时被阻止,并且您生成了一个新的greenlet,那么它将被安排,否则不会。在您的示例中,套接字正在重新指定数据,即生成的greenlet正在接收数据。根据我对gevent的理解,IO操作将使greenlets切换。如果在这个时候,一个新的小绿虫即将诞生。然后在产卵后,gevent将立即切换到新的greenlet。我在吗?产卵后,greenlet计划运行。下次gevent循环运行时,它可能会被执行,但不是100%确定,例如,如果循环只运行一次,可能会有其他挂起的任务。。。