让PyDev挂起来处理除MainThread之外的线程

R.D*_*wdy 5 python multithreading pydev

我有一个在Linux服务器上运行的多线程Python应用程序.我可以使用PyDev的Debug Server远程调试它,这似乎是一个非常有价值的调试资源.然而,我看到的一个问题就是阻止它像我想的那样有用.

当我的应用程序在服务器上运行时,我可以在另一个盒子上进入Eclipse,暂停MainThread,获得当时最新的堆栈跟踪,然后恢复执行.这很棒.但是,当我在其中一个子线程上尝试时,挂起按钮会变灰,但是没有堆栈跟踪,所有内容都会保持正常运行.我可以在Debug窗口中看到有一个子线程和它的PID,但无法真正控制它或查看它是什么.右键单击并尝试有用的"复制堆栈"只能给我"Thread-4 - pid29848_seq5".

断点似乎工作正常.如果一个子线程击中其中一个,我可以单步执行并观察变量等.但是,有效地使用它需要我在代码中已经有一个特定的兴趣点.我真的更希望运行我的应用程序,当它进入一个不寻常的状态时,使用PyDev来查看是什么.

我的设置有问题吗?这只是PyDev的限制吗?我怎样才能看到子线程发生了什么?

baz*_*zza -2

鉴于 Python 并不能真正正确地处理线程(GIL 必然会以某种方式把事情搞砸),如果调试它们是一种不那么令人兴奋的体验,我不会感到惊讶。如果涉及到这一点,即使在最新版本的 GDB 和 CDT 下,调试 C/C++ 线程的体验也不是很好。

我实际上并不确定,但我有一种预感,在 Python 中采用多进程而不是多线程可能会让您的体验更好。如果您进行安排,以便 Eclipse/PyDev 的单个实例调试单个 Python 进程,您最终可能会在屏幕上看到很多窗口,但这将是一种更加灵活的调试体验。

这就是我以前在 VxWorks 下用 C 语言所做的事情,其中​​没有线程或进程,只有任务。结果是您可以为每个任务运行一个调试器,这真是太棒了。