首页 > 编程问答 >使用 p._popen 作为 None 启动 multiprocessing.Process 时出错

使用 p._popen 作为 None 启动 multiprocessing.Process 时出错

时间:2024-07-24 11:19:27浏览次数:13  
标签:python python-multiprocessing

我在使用 multiprocessing.Process 时遇到一些问题。简单来说,我创建了多个进程 p ,并通过调用 p.start() 来启动它们。

import multiprocessing
def _start_process(args):
    # some other codes to generate some_args
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target=some_func, args=[q, some_args])
    p.start()

# retrieve result from queue, join and close the process in some other functions. 

这在大多数情况下都可以正常工作,但是我在调​​用 start 时偶尔会遇到一个奇怪的错误:

Traceback (most recent call last):
  File ".../__init__.py", line 63, in _start_process
    p.start()
  File ".../lib/python3.10/multiprocessing/process.py", line 120, in start
    _cleanup()
  File ".../lib/python3.10/multiprocessing/process.py", line 64, in _cleanup
    if p._popen.poll() is not None:
AttributeError: 'NoneType' object has no attribute 'poll'

该错误并不经常发生。但是,我仍然需要解决这个问题,因为每当我运行一项大型作业时,一个未启动的进程最终会破坏最终结果。由于这种情况是随机发生的,因此我无法可靠地复制该错误。当我在主进程中使用大块内存(~20GB)并同时启动许多短进程(~40)时,这种错误似乎更频繁地发生。这不是酸洗错误,因为我只将一小部分数据分发到每个进程。我正在使用 RockyLinux 9.0 和 python 3.10。

如果有人能向我提供有关调用 p._popen None p.start 什么场景的线索,那就太好了。


这个错误提示在 multiprocessing.Process 对象 p 上, p._popen 的值为 None ,导致无法调用 poll 方法。这通常意味着在创建进程时,启动子进程的底层机制失败了,而 p._popen 没有被正确设置。

以下是一些可能导致此问题的原因和建议的调试步骤:

1. 资源限制:

  • 文件描述符限制: 每个进程都有一个打开文件描述符的数量限制。如果同时启动许多进程,并且每个进程都打开许多文件或套接字,则可能会达到此限制。尝试增加系统和用户级别的文件描述符限制。
  • 内存限制: 提到在使用大量内存时问题更频繁地发生。尝试减少主进程的内存使用量,或者增加系统可用的内存。

2. 子进程启动失败:

  • 目标函数错误: 确保 some_func 函数没有引发任何异常,并且它可以成功完成。尝试在单独的脚本中运行 some_func 函数,看看是否出现任何错误。
  • 参数传递错误: 检查传递给 some_func 的参数,确保它们是可序列化的并且没有错误。
  • 环境问题: 尝试在一个干净的环境中运行的代码,以消除任何潜在的库冲突或环境变量问题。

3. 调试步骤:

  • 打印日志: _start_process 函数中添加 print 语句,以查看进程创建过程中变量的值,尤其是在 p.start() 之前和之后打印 p._popen 的值。
  • 使用 try...except 块: p.start() 包裹在 try...except 块中,并在异常发生时打印错误信息,以获取更多关于失败原因的上下文。
  • 简化代码: 尝试创建一个最小化的代码示例,仅包含重现错误所需的最少代码。这将有助于隔离问题并排除其他因素的影响。

4. 其他建议:

  • 尝试使用 concurrent.futures 模块,它提供了一种更高级别的 API 来管理并发任务,并且可能更稳定。
  • 升级 Python 版本: 确保使用的是最新版本的 Python,因为旧版本可能包含已修复的错误。

请尝试以上步骤来诊断和解决的问题。如果问题仍然存在,请提供更多上下文信息,例如的代码示例、操作系统版本和 Python 版本,以便我提供更具体的帮助。

标签:python,python-multiprocessing
From: 78786243

相关文章

  • 你能对 Python 类型注释进行模式匹配吗?
    你能在Python类型上进行模式匹配吗?我见过简单的例子:importbuiltinsmatchx:casebuiltins.str:print("matchedstr")casebuildins.int:print("matchedint")但我想在嵌套类型上进行模式匹配,比如Annotated[Optional[Literal["a",......
  • python Polars:替换嵌套列表的元素
    有谁知道是否可以有效地替换极坐标中嵌套列表的元素。例如:s=pl.Series('s',[[1,2,3],[3,4,5]])#replace3with10toget[[1,2,10],[10,4,5]]我已经尝试过s.to_frame().with_columns(pl.when(pl.col('s')==3)...)但是pl.when不喜欢List[bo......
  • Python 中的常量应该大写吗?
    在PEP8中,一般规则是在UPPER_CASE字符中声明常量。在现实生活中,可能有多种情况:#!envpythonDATABASE_HOST='localhost'app=Flask('myapp')base_two=partial(int,base=2)通常我们将字符串类型或数字类型变量视为不可变的,因此是常量,而不是对象或函数。问题是......
  • 多重处理会导致 Python 崩溃,并给出一个错误:调用 fork() 时可能已在另一个线程中进行
    我对Python比较陌生,并试图为我的for循环实现一个多处理模块。我在img_urls中存储了一个图像url数组,我需要下载并应用一些Google视觉。if__name__=='__main__':img_urls=[ALL_MY_Image_URLS]runAll(img_urls)print("---%sseconds---"%(......
  • Python编程时输入操作数错误
    我正在用Python编写下面的代码来模拟控制系统。但是,当我调试代码时,我面临以下问题:matmul:输入操作数1没有足够的维度(有0,gufunc核心,签名为(n?,k),(k,m?)->(n?,m?)需要1)文件“D:\ÁreadeTrabalho\GitHub\TCC\CódigosMarcela\SistemaSISO_tres_estados_new.py”,......
  • Python入门知识点 7--散列类型与字符编码
    1、初识散列类型(无序序列)数据类型分为3种:   前面已经学过了两种类型   1.数值类型:int/float/bool只能存储单个数据      2.序列类型:str/list/tuple,有序的存储多个数据--有序类型,有下标,可以进行索引切片步长操作          3.散列类型......
  • Python入门知识点 6--序列类型的方法
    1、初识序列类型方法序列类型的概念:数据的集合,在序列类型里面可以存放任意的数据也可以对数据进行更方便的操作这个操作就是叫增删改查(crud)(增加(Creat),读取查询(Retrieve),更新(Update),删除(Delete)几个单词的首字母简写)增删改查是操作数据最底层的操作(从本质......
  • Python项目流程图
    我有一个由多个文件夹组成的Python项目,每个文件夹包含多个脚本。我正在寻找一个Python库或软件/包,它们可以生成流程图,说明这些脚本如何互连并绘制出从开始到结束的整个过程。自动生成Python项目流程图确实是一个挑战,目前没有完美通用的解决方案。主要原因是:......
  • 使用 mypy 时Python中的继承和多态性不起作用
    我正在寻找用mypy做一些标准的多态性,我以前从未使用过它,而且到目前为止它并不直观。基类classContentPullOptions:passclassTool(Protocol):asyncdefpull_content(self,opts:ContentPullOptions)->str|Dict[str,Any]:...子类classGoogle......
  • Python函数获取匹配和错误记录
    我有一个以下格式的json文件:[{"type":"BEGIN","id":"XYZ123"},{"type":"END","id":"XYZ123",},{"type":&......