在Python中调试多处理


Answers:


6

真正的多处理Python程序(与必须处理可怕的GIL的线程 Python程序相反)与任何其他语言都没有什么不同。它们都有相同的基本挑战:

  1. 任务分配和结果报告。即使它们主要是在独立的数据集上工作,它们通常也必须返回主线程以报告结果并获取要处理的新数据。这可能是一个瓶颈。
  2. 比赛条件。进程试图一次使用一个资源,并且它们需要使用互斥锁(或类似的东西)来避免遍历彼此的数据。无法保护此类资源可能导致非常痛苦的调试会话。
  3. 顺序性。有时您试图使某些事情变得平行。各个进程最终都在等待对方做某事,最终结果是,您出于所有意图和目的采取了顺序程序,使其并行化,并且仍然最终在线性时间内执行(或更糟)。

尽管有一些开发方法试图避免上述每一个问题,但最终您还是需要真正考虑自己在做什么。我建议进行繁重的压力测试-远远超出您在现实生活中可能想到的任何事情-因此,与在主要演示过程中或在生产过程中相比,您很有可能会遇到机会之窗并在开发中大放异彩。

我们曾经使用带有微秒级时间戳的日志文件,然后创建了一个颜色编码的日志查看应用程序,因此我们可以尝试可视化M处理器上运行的N个进程之间发生的情况。我们还尝试(并且大部分成功)创建了一个系统,该系统可以删除日志文件以重新创建崩溃的上下文。

但是最好的工具是良好的设计和真正邪恶,讨厌的人,他们试图将您的应用程序从水中吹走。(嗨,dbell!)


26

我发现非常有用的一件事是使用multiprocessing模块中的现有记录器。在您的主要代码中尝试以下操作:

import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)

另请参阅:http : //docs.python.org/library/multiprocessing.html#logging

此外,您可以使用以下命令访问当前进程名称:

cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))

请参阅:http : //docs.python.org/library/multiprocessing.html#multiprocessing.current_process

除此之外,除了标准调试方法(如pdb&co)外,我什么都不知道。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.