Pydevd 对 python 的多处理和线程的影响

Pydevd's effect on python's multiprocessing & threading

pydevd.py 的影响 - Eclipsed 和 Pycahrm 使用的 pydev 调试器 - 对 python 的 multiprocessingthreading 的影响是什么?

当我启动我的 python 服务器时——它同时使用 multiprocessingthreading——没有调试,它在启动时崩溃,没有有用的回溯。但是,当我 运行 使用 Pycharm 的调试器时,进程启动并正常运行。

那么是什么导致了这种性能差异?可能是 Process() 的序列化或对 Thread() 强加一些命令?

好吧,这可能是你有一些竞争条件,只是让调试器 运行 以不同的顺序排列东西 运行(它做了一些 monkey-patching 到 auto-attach 到子进程,它做了很多事情来重置它在新进程中的状态。

请注意,如果您在 [=33= 上使用 fork 开始 sub-processes,同时使用 threadingmultiprocessing 可能会非常棘手](要恢复,如果你这样做的话,角落案例会出现死锁)——如果你在 Python 2 上,则没有解决方法,但如果你在 Python 3 上,你应该能够将启动方法设置为 spawn: https://docs.python.org/3/library/multiprocessing.html#multiprocessing.set_start_method.

我意识到在某些用例中 fork 方法可能比 spawn 更可取(以避免在某些 use-cases 上复制太多内存)。如果那是你的用例,你不应该使用线程来继续使用 fork 或者你应该 非常 小心这种交互并重置线程在新进程中可能触及的任何东西,并且删除对所有线程的引用并在新进程中重新启动它们(调试器是 multi-threaded 并且做了很多事情来尝试解决这个问题,但我仍然知道仅仅通过在某些极端情况下使用线程它可能会崩溃 - 很少 - 只是因为你正在使用这些线程进行分叉 运行ning 取决于系统级锁)。