pydevd.py
的 -Eclipsed 和 Pycahrm 使用的 pydev 调试器 - 对 pythonmultiprocessing
和threading
的影响是什么?
当我启动我的python服务器时 - 它同时使用multiprocessing
和threading
- 没有调试,它在启动时崩溃,没有有用的回溯。但是,当我使用 Pycharm 的调试器运行时,进程会启动并正常运行。
那么,是什么导致了这种性能差异呢?可能是Process()
的序列化或对Thread()
施加某些命令吗?
好吧,可能是您有一些赛车条件,只需让调试器以不同的顺序运行(它会执行一些猴子修补以自动附加到子进程,并且它会做很多事情来重置新进程中的状态)。
请注意,如果您在 Linux 上使用fork
启动子进程,则同时使用threading
和multiprocessing
可能会非常棘手(要恢复,如果您这样做,预计在极端情况下会出现死锁)——如果您使用的是 Python 2,则没有解决方法,但如果您使用的是 Python 3,您应该能够将 start 方法设置为spawn
: https://docs.python.org/3/library/multiprocessing.html#multiprocessing.set_start_method。
我意识到有些用例中,fork
方法可能比spawn
更受欢迎(以避免在某些用例上复制太多内存)。如果这是您的用例,则不应使用线程继续使用fork
或者您应该非常小心该交互并重置线程在新进程中可能触及的任何内容,并删除对所有线程的引用并在新进程中重新启动它们(调试器是多线程的,并且做了很多事情来尝试解决此问题, 但我仍然知道,仅仅通过在某些极端情况下有线程,它可能会崩溃 - 很少 - 只是因为你正在分叉这些线程根据系统级锁运行)。