Pydevd 对 python 的多处理和线程的影响
Pydevd's effect on python's multiprocessing & threading
pydevd.py
的影响 - Eclipsed 和 Pycahrm 使用的 pydev 调试器 - 对 python 的 multiprocessing
和 threading
的影响是什么?
当我启动我的 python 服务器时——它同时使用 multiprocessing
和 threading
——没有调试,它在启动时崩溃,没有有用的回溯。但是,当我 运行 使用 Pycharm 的调试器时,进程启动并正常运行。
那么是什么导致了这种性能差异?可能是 Process()
的序列化或对 Thread()
强加一些命令?
好吧,这可能是你有一些竞争条件,只是让调试器 运行 以不同的顺序排列东西 运行(它做了一些 monkey-patching 到 auto-attach 到子进程,它做了很多事情来重置它在新进程中的状态。
请注意,如果您在 [=33= 上使用 fork
开始 sub-processes,同时使用 threading
和 multiprocessing
可能会非常棘手](要恢复,如果你这样做的话,角落案例会出现死锁)——如果你在 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 取决于系统级锁)。
pydevd.py
的影响 - Eclipsed 和 Pycahrm 使用的 pydev 调试器 - 对 python 的 multiprocessing
和 threading
的影响是什么?
当我启动我的 python 服务器时——它同时使用 multiprocessing
和 threading
——没有调试,它在启动时崩溃,没有有用的回溯。但是,当我 运行 使用 Pycharm 的调试器时,进程启动并正常运行。
那么是什么导致了这种性能差异?可能是 Process()
的序列化或对 Thread()
强加一些命令?
好吧,这可能是你有一些竞争条件,只是让调试器 运行 以不同的顺序排列东西 运行(它做了一些 monkey-patching 到 auto-attach 到子进程,它做了很多事情来重置它在新进程中的状态。
请注意,如果您在 [=33= 上使用 fork
开始 sub-processes,同时使用 threading
和 multiprocessing
可能会非常棘手](要恢复,如果你这样做的话,角落案例会出现死锁)——如果你在 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 取决于系统级锁)。