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

时间:2019-06-04 06:31:04

标签: python multithreading pycharm multiprocessing pydev

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

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

那么造成这种性能差异的原因是什么?是对Process()进行序列化还是对Thread()施加一些命令?

1 个答案:

答案 0 :(得分:1)

好吧,可能是您处于某种竞争状态,只是让调试器以不同的顺序运行(它进行了一些猴子补丁,以自动附加到子流程,并且做了很多事情来重置其状态)。新流程)。

请注意,如果您在Linux上使用threading启动子流程,则同时使用multiprocessingfork可能会非常棘手(要恢复,会出现死锁在极端情况下(如果您这样做))-如果您使用的是Python 2,则没有解决方法,但是如果您使用的是Python 3,则应该可以将start方法设置为spawnhttps://docs.python.org/3/library/multiprocessing.html#multiprocessing.set_start_method

我意识到在某些情况下,fork方法可能比spawn更为可取(以避免在某些情况下复制过多的内存)。如果这是您的用例,则您不应该使用线程来继续使用fork,或者您应该非常对此交互过程保持谨慎,并重置线程在新过程中可能碰到的所有内容,并删除对所有线程并在新进程中重新启动它们(调试器是多线程的,并且做了很多事情来尝试解决该问题,但是我仍然意识到,仅在某些极端情况下使用线程可能会崩溃-很少-只是因为您要分叉那些正在运行的线程,具体取决于系统级别的锁定。