当前位置: 首页 > 面试题库 >

如何在多处理器系统上生成并行子进程?

袁运锋
2023-03-14
问题内容

我有一个Python脚本,想用作另一个Python脚本的控制器。我有一台具有64个处理器的服务器,因此想生成第二个Python脚本的64个子进程。子脚本称为:

$ python create_graphs.py --name=NAME

NAME是XYZ,ABC,NYU等。

在我的父控制器脚本中,我从列表中检索name变量:

my_list = [ 'XYZ', 'ABC', 'NYU' ]

所以我的问题是,从小就产生这些过程的最佳方法是什么?我想一次将子级的数量限制为64个,因此需要跟踪状态(子级进程是否完成),以便有效地保持整个世代的运行。

我研究了使用子进程包,但拒绝了它,因为它一次只生一个孩子。我终于找到了多处理器程序包,但我承认整个线程与子进程文档不堪重负。

现在,我的脚本用于一次subprocess.call只生一个孩子,看起来像这样:

#!/path/to/python
import subprocess, multiprocessing, Queue
from multiprocessing import Process

my_list = [ 'XYZ', 'ABC', 'NYU' ]

if __name__ == '__main__':
    processors = multiprocessing.cpu_count()

    for i in range(len(my_list)):
        if( i < processors ):
             cmd = ["python", "/path/to/create_graphs.py", "--name="+ my_list[i]]
             child = subprocess.call( cmd, shell=False )

我真的希望它能一次生下64个孩子。在其他stackoverflow问题中,我看到人们在使用Queue,但这似乎对性能产生了影响?


问题答案:

您正在寻找的是多处理中的进程池类。

import multiprocessing
import subprocess

def work(cmd):
    return subprocess.call(cmd, shell=False)

if __name__ == '__main__':
    count = multiprocessing.cpu_count()
    pool = multiprocessing.Pool(processes=count)
    print pool.map(work, ['ls'] * count)

这是一个计算示例,使它更易于理解。下面将在N个进程上划分10000个任务,其中N是cpu计数。请注意,我将None传递为进程数。这将导致Pool类使用cpu_count作为进程数(参考)

import multiprocessing
import subprocess

def calculate(value):
    return value * 10

if __name__ == '__main__':
    pool = multiprocessing.Pool(None)
    tasks = range(10000)
    results = []
    r = pool.map_async(calculate, tasks, callback=results.append)
    r.wait() # Wait on the results
    print results


 类似资料:
  • 问题内容: 如果在多处理器或多处理器计算机上运行,​​而jvm可能绝对同时运行多个线程(不只是同时出现),那么api方法返回什么?…在​​上述情况下,它是否会返回当前线程之一是随机的吗? 问题答案: 它返回您当前正在其中运行的线程。如果你有两个核心和两个线程和完全并行运行,要求在同一时间这个方法,它将返回和适当的。 您的理解是正确的-此方法返回的线程始终处于运行状态-因为必须从某个线程调用该线程,

  • 我有以下的要求要设计。 有多个作业要完成。每个作业都有一个作业id和一个系统id。作业id是唯一的,但同一系统id可能有多个作业 应顺序处理给定系统id的作业 其中某些作业可能处于等待状态,如果处于等待状态,则在x秒/分钟之前不应重新尝试返回 系统约束 唯一系统ID的数目可以是lakhs 每个系统ID的作业数可以是lakh 我曾考虑过使用kafka,但如果一个系统被阻塞,那么该分区中不同系统的所有

  • 我正在尝试将bash脚本迁移到Python。 bash脚本并行运行多个OS命令,然后在继续之前等待它们完成,即: 命令 我希望使用Python子进程实现同样的目标。这可能吗?如何等待subprocess.call命令完成后再继续?

  • 安装程序的问题是,Camel没有为调用我的自定义异常处理程序。路由SaveSample发生验证异常。下面是我的发现,它是如何进一步深入骆驼处理器类型的。 > 控件将转到中,在那里查找异常策略。失败exchange的根(即->postSample)在此应定义异常处理程序。 稍后,Camel转到failing(即saveSample)以标识异常处理程序。 这意味着,在下面的表达式中,routeId来自

  • 所以我正在编写代码,它将解析文件夹中的多个文本文件,收集它们的信息,并将这些信息保存在两个静态列表实例变量中。信息存放的顺序并不重要,因为我最终将对其进行排序。但由于某些原因,增加线程数不会影响速度。这是我的run方法和主方法中利用多线程的部分。 如果需要额外的信息,我基本上有一个静态实例变量作为我需要浏览的文件的数组,还有一个常量是线程数(为了测试目的手动更改)。如果我有4个线程和8个文件,每个

  • 我正在使用在每一行上执行一个函数,这需要很长时间,为了加快速度,有没有一种方法可以使用并行处理,使多个核心在不同的行上并发工作? 例如,我将PRISM天气数据(https://prism.oregonstate.edu/)聚合到州一级,同时按人口加权。这是基于https://www.patrickbaylis.com/blog/2021-08-15-pop-weighted-weather/. 请