【问题标题】:Multiprocessing freezing because of semaphore_tracker process in the background由于后台的 semaphore_tracker 进程导致多进程冻结
【发布时间】:2019-08-22 17:05:06
【问题描述】:

我正在为一个项目使用 Python 多处理,有时进程会冻结,显然它发生的原因是我发现这个进程正在运行 ps aux

python -c from multiprocessing.semaphore_tracker import main;main(39)

更多信息:

  • 如果我终止进程,一切都会正常运行
  • 此问题并不常见,这意味着可能有几天运行一切正常而不会发生
  • 我正在使用 PyCharm
  • 我正在使用 PyCharm 远程解释器和有时使用 SSH 在服务器中运行此 Python 代码

问题:

  • 这个进程出现是怎么回事?
  • 为什么它不能自己完成?
  • 冻结其他进程的原因是什么?
  • 如何避免这种情况?

【问题讨论】:

  • semaphore_tracker 顾名思义,就是用来跟踪信号量的。 Unix 支持有限数量的命名信号量,并且它们并不总是在进程退出时被清除。我认为这不是您的程序冻结的原因,您的程序中可能有一些信号量逻辑导致了这种情况。尝试使用您的多处理代码修改您的问题。有关 semaphore_tracker 的更多信息:github.com/python/cpython/blob/3.5/Lib/multiprocessing/…
  • 我以一种非常简单的方式使用多处理(只需创建一个参数列表然后调用pool.starmap(func, arguments)),我不使用任何与信号量相关的东西。

标签: python multiprocessing python-multiprocessing


【解决方案1】:

根据documentation

在 Unix 上,使用 spawn 或 forkserver 启动方法还将启动一个信号量跟踪器进程,该进程跟踪由程序进程创建的未链接的命名信号量。

我为什么会想要使用 spawn start 方法。在 ms-windows 上这是一个(非常聪明的)必要条件,因为该操作系统没有 fork 系统调用。

所以我怀疑 Pycharm 强制使用forkserver start 方法,因为它在内部使用多个线程,而标准的 UNIX fork start 方法不能很好地处理多线程程序。

尝试从 shell 运行您的项目。在类 UNIX 操作系统上,应该默认使用不需要信号量跟踪器进程的 fork 启动方法。

【讨论】:

  • 我不能总是在 shell 上运行程序,因为我经常使用调试器。还有其他想法吗?
  • 使用set_start_method强制使用fork start 方法。或者放弃 pycharm 并使用pdb
  • 我读到了这个set_start_method('fork'),但它会有效地做什么?这不是默认选项吗?
  • 这是 Linux 和 macOS 等类 UNIX 系统的默认设置。 Ms-windows 必须使用spawn 方法,因为它缺少fork 系统调用。 fork 系统调用创建一个进程的相同副本。因此,两个进程都将相同的代码和数据加载到内存中。 fork 的返回值在两个进程中不同,因此它们知道哪个是父进程,哪个是副本。 multiprocessing 非常方便,因为子进程继承父进程中的所有数据。
  • @GustavoMaia 我怀疑 pycharm 与它有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多