在 gevent 中处理 Thread/Greenlit kill
Handle Thread/Greenlit kill in gevent
我想在 gevent 中创建一个非阻塞的 thread/Greenlit。该线程旨在 运行 直到发送某种信号来停止它,此时我希望执行一个操作(保存一些数据)。
来自 gevent kill docs 我希望以下代码在被杀死时打印 Done
:
import gevent
def myloop():
try:
while True:
pass
except gevent.greenlet.GreenletExit:
print "Done"
thread = gevent.spawn(myloop)
thread.kill()
然而,这并没有发生。关于为什么的任何想法?我做错了什么可怕的事吗?我怎样才能达到指定的行为?
由于您的 greenlet 实际上从未 "blocking",而是永远消耗 CPU,因此它从未被杀死。从 gevent 的角度来看,它会被杀死,但这永远不会发生,因为 greenlet 永远不会离开它的 while 循环。
我很确定,如果您在 while 循环中添加 sleep(0)
,sleep
将引发 GreenletExit 并且循环将中断。
事实上,您可以通过查看您的代码来推断这一点:
try:
while True:
pass
except ...:
...
从语法上讲,这里没有任何可以引发异常的内容。我们需要做一些可以筹集的事情,那就是sleep(0)
。
我想在 gevent 中创建一个非阻塞的 thread/Greenlit。该线程旨在 运行 直到发送某种信号来停止它,此时我希望执行一个操作(保存一些数据)。
来自 gevent kill docs 我希望以下代码在被杀死时打印 Done
:
import gevent
def myloop():
try:
while True:
pass
except gevent.greenlet.GreenletExit:
print "Done"
thread = gevent.spawn(myloop)
thread.kill()
然而,这并没有发生。关于为什么的任何想法?我做错了什么可怕的事吗?我怎样才能达到指定的行为?
由于您的 greenlet 实际上从未 "blocking",而是永远消耗 CPU,因此它从未被杀死。从 gevent 的角度来看,它会被杀死,但这永远不会发生,因为 greenlet 永远不会离开它的 while 循环。
我很确定,如果您在 while 循环中添加 sleep(0)
,sleep
将引发 GreenletExit 并且循环将中断。
事实上,您可以通过查看您的代码来推断这一点:
try:
while True:
pass
except ...:
...
从语法上讲,这里没有任何可以引发异常的内容。我们需要做一些可以筹集的事情,那就是sleep(0)
。