首页 > 编程问答 >Python多处理池不启动多个进程

Python多处理池不启动多个进程

时间:2024-07-31 06:19:06浏览次数:12  
标签:python python-3.x multiprocessing starmap

我正在尝试使用多处理池来创建多个进程。 我有一个工作函数 dummy_proc 定义如下:

import re 
from multiprocessing import Pool

def regex_check(input_string):
    # Pattern to match both "pm_lat" and "pm_lon_coslat" followed by two floats
    pattern = r"(check1|check2)_(-?\d+\.\d+)_(-?\d+\.\d+)"
    
    # Find all matches of the pattern in the input string
    matches = re.findall(pattern, input_string)
    
    # 'matches' is a list of tuples, each containing the keyword and the two matched float values
    matches = ["_".join(match) for match in matches]
    return matches

def dummy_proc(
    group1: str,
    group2: str,
) -> bool:
    """performs a simple regex check.

    Args:
        group1 (string): The first group of ROIs.
        group2 (string): The second group of ROIs.

    Returns:
        bool: True if no two item in the two lists combined are the same.
    """
    group1_srs = regex_check(group1)
    group2_srs = regex_check(group2)
    return len(set(group1_srs).intersection(set(group2_srs))) == 0

def do_stuff(pairs):
    with Pool(processes=12) as pool:
        result = pool.starmap(dummy_proc, [(pair[0], pair[1]) for pair in pairs])
    return result

保存为 src.py

然后 do_stuff 导入到脚本中并按如下方式执行:

from src import do_stuff

def main():
    pairs = [('check1_0.1_0.2', 'check2_0.3_0.4'), ('check2_0.7_0.8', 'check2_0.7_0.8')]
    results = do_stuff(pairs)
    print(results)

if __name__ == '__main__':
    main()

当使用上面的 multiprocessing.Pool 时然后检查 htop 来监控 cpu 使用情况,我只看到一个正在创建的进程。

pairs 大约有 600 万个整数长。我尝试将 chunksize 设置为 len(pairs)/processes 但无济于事。 我在这里错过了什么吗?难道我不应该期望在使用 htop 时看到列出 12 个进程吗?

PS:这是一个 MWE。这是在运行 Rocky Linux 版本 8.9 (Green Obsidian) 的 HPC 上运行的


代码似乎没问题,问题很可能出在如何运行代码以及的环境。正在使用 if __name__ == '__main__': ,这是个好的做法,但它在某些情况下(特别是像 Jupyter notebooks 这样的交互式环境)可能无法按预期工作。

以下是可能导致只看到一个进程而不是多个进程的几个原因:

  1. 交互式环境: 如果在 Jupyter notebook 或类似的环境中运行此代码,则多处理可能无法按预期工作。尝试将的代码保存到一个 Python 文件(例如 my_script.py )并在终端中使用 python my_script.py 运行它。

  2. 缺少 shebang: 确保的 Python 文件(例如 src.py )开头有 shebang 行: #!/usr/bin/env python 。这将确保使用正确的 Python 解释器运行的脚本。

  3. 资源限制: 的 HPC 集群可能有一些资源限制,这些限制阻止了创建更多进程。联系的系统管理员以检查是否有任何此类限制。

  4. 输入数据大小: 虽然提到 pairs 大约有 600 万个元素,但这本身不应该成为问题。但是,如果每个字符串都非常大,那么在进程之间传递数据可能会产生很大的开销。尝试使用较小的数据集进行测试,看看是否有所不同。

  5. chunksize 参数: 提到尝试使用 chunksize 参数,但这并没有帮助。虽然这不是问题的主要原因,但为 starmap 正确设置 chunksize 可以提高性能。尝试使用不同的值,例如 chunksize=1000 chunksize=len(pairs)//processes

建议:

  • 尝试将的代码保存到一个 Python 文件并在终端中运行,以消除任何与交互式环境相关的问题。
  • 使用较小的数据集和不同数量的进程进行实验,以缩小问题的根源。
  • 监控 CPU 使用情况,而不仅仅是进程数量。应该会看到多个 CPU 核心的使用率增加。

如果仍然遇到问题,请提供有关的环境(操作系统、Python 版本、HPC 类型)以及用于运行代码和监控进程的命令的更多信息。

标签:python,python-3.x,multiprocessing,starmap
From: 78813605

相关文章

  • 迟滞建模作为 Python GEKKO 中 MPC 的控制约束
    我试图使用PythonGEKKO在用于控制信号调度的MPC优化问题中引入滞后约束。这已成为一项艰巨的任务,因为我无法将以下问题转换为GEKKO理解的方程。问题:如果开启时间<最短开启时间,则给定资产的控制调度不应将其关闭。如果关闭时间<最小关闭时间......
  • 在 Lambda Python 中获取 errorMessage": "期望值: 第 1 行第 1 列 (char 0)"
    我正在尝试使用slackapi和awslambda函数创建一个slack机器人。现在我只希望每当用户说“你好”时它就响应“你好”。当我在Lambda代码编辑器中测试代码时,出现此错误。我对Lambda很陌生,并且已经被困在这个问题上有一段时间了。非常感谢任何帮助!完整错误:Response......
  • 具有 Python lambda 函数的 QTimer 使用先前的数据运行
    我有一个GUI项目,它使用PySide2和Python3.8,它在QThread中执行一些后台任务。在该QThread中,我有QTimer成员对象,该对象必须定期运行一个函数,每次向其传递不同的数据。我没有使用QTimer.singleShot静态函数,因为如果需要某些特定场景,我需要......
  • 我如何在 python 上使用 spire.pdf 修复此错误
    我使用spirepdf,但出现以下错误:“DllNotFound_Windows,libSkiaSharp,Nosepuedeencontrarelmóduloespecificado.:....”defextract_text_from_pdf(file_path,output_file):#LoadaPDFdocumentdoc=PdfDocument()doc.LoadFromFile(file_path)ex......
  • C++ 函数返回极其缓慢,远慢于功能等效的 python 代码
    我有一个在我编写的脚本中使用的函数,用于从列表中删除多余的阻塞关键字。基本上,输入(以任何顺序):{"apple","bapple","banana","cherry","bananaman","sweetherrypie","sweet","b"}它应该输出一个缩小的字符串数组(以任何顺序):......
  • 在预定时间从 python telegram bot 发起对话
    对于没有提供代码,我提前表示歉意。我明天会尝试添加它,但我现在还没有接近它,思考如何解决这个问题让我一直在思考。我已经为一个机器人创建了一个程序,该程序的数据帧充满了之前请求的用户添加到机器人的消息列表中。现在,机器人使用job_queue在一天中的随机时间向每个用户发......
  • python函数:带星号的参数一个接一个
    我想知道为什么定义以下函数被认为是好的。deffoo(*x,y):pass据我所知,现在有调用此函数的方法,因为它总是缺少y的值。(如果我错了,请纠正我。)这有什么我不知道的用处吗?你说得对,在Python中定义一个像deffoo(*x,y):...这样的函数,在试图以常规方......
  • 基于遗传(GA)、粒子群(PSO)、模拟退火(SA)、禁忌搜索(ST)、蚁群算法(ACO)、自自组织神
        ......
  • 10个append()函数在Python程序开发中的创新应用
    文末赠免费精品编程资料~~在Python编程的世界里,append()函数是列表操作中最常见的方法之一。它允许我们在列表的末尾添加一个元素,这一简单的功能却能激发无限的创造力。今天,我们将探讨append()函数在Python程序开发中的10种创新应用,从基本用法到高级技巧,逐步深入。1.构......
  • 全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规
    全网最适合入门的面向对象编程教程:28类和对象的Python实现-Python编程原则、哲学和规范大汇总摘要:本文主要介绍了在使用Python进行面向对象编程时,Python异常处理的原则-“请求谅解,而非许可”,以及软件设计和Python的编程原则,同时介绍了PEP8规范。原文链接:FreakStud......