Skip to main content
 首页 » 编程设计

python之gevent:调试旋转线程

2025年05月04日11Renyi-Fan

在我基于 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 中。