我的项目正在使用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)
在我的生产代码中,我还没有找到任何关于如何触发任务运行的线索。 所以我在这里要求了解在上面的服务器中运行新生成任务的方法。
答案 0 :(得分:1)
在您的代码中,您必须致电gevent.sleep(0)
,因为没有别的
触发gevent循环。有了这个睡眠就可以恢复控制
gevent,执行衍生的greenlet。
生产代码中的行TSocket.socket = gevent.socket
修补了
使用默认的thrift socket实现
改为gevent套接字; gevent套接字运行gevent循环,所以你真的
需要此修补程序才能运行代码。
没有补丁,TSocket.socket
会阻塞并杀死并发
(没有OS级别的线程)。