我正在尝试使用多处理池来创建多个进程。
我有一个工作函数
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 这样的交互式环境)可能无法按预期工作。
以下是可能导致只看到一个进程而不是多个进程的几个原因:
-
交互式环境: 如果在 Jupyter notebook 或类似的环境中运行此代码,则多处理可能无法按预期工作。尝试将的代码保存到一个 Python 文件(例如
my_script.py
)并在终端中使用python my_script.py
运行它。 -
缺少 shebang: 确保的 Python 文件(例如
src.py
)开头有 shebang 行:#!/usr/bin/env python
。这将确保使用正确的 Python 解释器运行的脚本。 -
资源限制: 的 HPC 集群可能有一些资源限制,这些限制阻止了创建更多进程。联系的系统管理员以检查是否有任何此类限制。
-
输入数据大小: 虽然提到
pairs
大约有 600 万个元素,但这本身不应该成为问题。但是,如果每个字符串都非常大,那么在进程之间传递数据可能会产生很大的开销。尝试使用较小的数据集进行测试,看看是否有所不同。 -
chunksize 参数: 提到尝试使用
chunksize
参数,但这并没有帮助。虽然这不是问题的主要原因,但为starmap
正确设置chunksize
可以提高性能。尝试使用不同的值,例如chunksize=1000
或chunksize=len(pairs)//processes
。
建议:
- 尝试将的代码保存到一个 Python 文件并在终端中运行,以消除任何与交互式环境相关的问题。
- 使用较小的数据集和不同数量的进程进行实验,以缩小问题的根源。
- 监控 CPU 使用情况,而不仅仅是进程数量。应该会看到多个 CPU 核心的使用率增加。
如果仍然遇到问题,请提供有关的环境(操作系统、Python 版本、HPC 类型)以及用于运行代码和监控进程的命令的更多信息。
标签:python,python-3.x,multiprocessing,starmap From: 78813605