在我基于 gevent 的程序中,我在某处有一个线程,它陷入了一个循环,类似于:
while True:
gevent.sleep(0)
我怎么知道这是哪个线程?是否可以列出(并获取堆栈跟踪)正在运行的线程?
请您参考如下方法:
方法一、超时
我在我的代码中使用它来跟踪可能阻塞的 greenlets。发生这种情况时会引发 NodeTaskTimeout。只需将您的作业包装在 Timeout 中或为它们提供 TimeOut 对象。
with Timeout(90, False):
task_jobs.join()
if task_jobs:
print 'task jobs killed', task_jobs
task_jobs.kill()
if settings.DEBUG:
raise NodeTaskTimeout
如果它挂起/阻塞/花费很长时间,则此打印将无法完成任务。 尤其令人讨厌的是那些相互依赖并导致死锁的工作 job1/thread -> job2/thread2 -> job3/thread3 和 job/thread3 仅在 job1 完成时完成,这永远不会发生,因为 job2 未完成,job2 未完成,因为 job3 未完成.. 你明白了; )
方法2 Settrace
http://www.rfk.id.au/blog/entry/detect-gevent-blocking-with-greenlet-settrace/
但您还需要将您怀疑正在“旋转”的代码放入 with block 中。
