pydevd.py
(Eclipsed和Pycahrm使用的pydev调试器)对python multiprocessing
和threading
的影响是什么?
当我启动同时使用multiprocessing
和threading
的python服务器时,没有调试,它在启动时崩溃,没有任何有用的回溯。但是,当我使用Pycharm的调试器运行时,该过程将启动并正常运行。
那么造成这种性能差异的原因是什么?是对Process()
进行序列化还是对Thread()
施加一些命令?
答案 0 :(得分:1)
好吧,可能是您处于某种竞争状态,只是让调试器以不同的顺序运行(它进行了一些猴子补丁,以自动附加到子流程,并且做了很多事情来重置其状态)。新流程)。
请注意,如果您在Linux上使用threading
启动子流程,则同时使用multiprocessing
和fork
可能会非常棘手(要恢复,会出现死锁在极端情况下(如果您这样做))-如果您使用的是Python 2,则没有解决方法,但是如果您使用的是Python 3,则应该可以将start方法设置为spawn
:https://docs.python.org/3/library/multiprocessing.html#multiprocessing.set_start_method
我意识到在某些情况下,fork
方法可能比spawn
更为可取(以避免在某些情况下复制过多的内存)。如果这是您的用例,则您不应该使用线程来继续使用fork
,或者您应该非常对此交互过程保持谨慎,并重置线程在新过程中可能碰到的所有内容,并删除对所有线程并在新进程中重新启动它们(调试器是多线程的,并且做了很多事情来尝试解决该问题,但是我仍然意识到,仅在某些极端情况下使用线程可能会崩溃-很少-只是因为您要分叉那些正在运行的线程,具体取决于系统级别的锁定。