Python多进程调试

bar*_*ley 7 python debugging multiprocessing pycharm winpdb

我正在尝试调试一个简单的 python 应用程序,但到目前为止还没有运气。

import multiprocessing

def worker(num):
    for a in range(0, 10):
        print a

if __name__ == '__main__':
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        p.start()
Run Code Online (Sandbox Code Playgroud)

我想在 for 循环中设置一个断点来跟踪 'a' 的值,但我尝试过的工具都无法做到这一点。到目前为止,我尝试使用以下方法进行调试:

  • PyCharm 并收到以下错误:ImportError: No module named pydevd - http://youtrack.jetbrains.com/issue/PY-6649看起来他们仍在为此进行修复,据我所知,没有 ETA这个
  • 我还尝试使用 Winpdb 进行调试 - http://winpdb.org但它根本不会进入我的 'worker' 方法而只是打印 'a' 的值

我真的很感激任何帮助!

Mak*_*nko 7

我发现当我要设置断点时替换multiprocessing.Process()为非常有用。threading.Thread()这两个类都有相似的参数,因此在大多数情况下它们是可以互换的。

通常我的脚本会一直使用,Process()直到我指定命令行参数为止--debug,该参数有效地将这些调用替换为Thread(). 这使我可以使用pdb.


小智 7

你应该能够做到这一点remote-pdb

from multiprocessing import Pool

def test(thing):
  from remote_pdb import set_trace
  set_trace()
  s = thing*2
  print(s)
  return s

if __name__ == '__main__':
  with Pool(5) as p:
    print(p.map(test,['dog','cat','bird']))
Run Code Online (Sandbox Code Playgroud)

然后就telnet到日志中列出的端口。

例子:

RemotePdb session open at 127.0.0.1:54273, waiting for connection ...
Run Code Online (Sandbox Code Playgroud)
telnet 127.0.0.1 54273
<telnet junk>
-> s = thing*2
(Pdb) 
Run Code Online (Sandbox Code Playgroud)

或者

nc -tC 127.0.0.1 54273

-> s = thing * 2
(Pdb)
Run Code Online (Sandbox Code Playgroud)

此时您应该能够调试该过程。


Cad*_*nge 1

在尝试调试 Python 代码时,我很少需要使用传统的调试器,而是更喜欢在代码中随意添加跟踪语句。我会将您的代码更改为以下内容:

import multiprocessing
import logging

def worker(num):
    for a in range(0, 10):
        logging.debug("(%d, %d)" % (num, a))

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        logging.info("Starting process %d" % i)
        p.start()
Run Code Online (Sandbox Code Playgroud)

在生产中,您可以通过将跟踪级别设置为logging.WARNING来禁用调试跟踪语句,这样您就只记录警告和错误。

Python 官方网站上有一个很好的基础高级日志记录教程。