首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python多处理-单个文件多个命令

问python多处理-单个文件多个命令
EN

Stack Overflow用户
提问于 2018-02-19 06:37:49
回答 2查看 306关注 0票数 1

我需要处理一个包含大约100个shell (bash)命令的文件;每行都有一个单独的shell命令。我必须并行执行这些命令(比如并行执行10个命令或20个命令,让CPU决定如何并行执行)。老实说,我不知道如何实现它,所以我只在这里的某个地方编写了一段代码;下面是相同的:

代码语言:javascript
复制
from subprocess import PIPE
import subprocess
import time


def submit_job_max_len(job_list, max_processes):
  sleep_time = 0.1
  processes = list()
  for command in job_list:
    print 'running process# {n}. Submitting {proc}.'.format(n=len(processes),
        proc=str(command))
    processes.append(subprocess.Popen(command, shell=False, stdout=None, stdin=PIPE))
    while len(processes) >= max_processes:
      time.sleep(sleep_time)
      processes = [proc for proc in processes if proc.poll() is None]
  while len(processes) > 0:
    time.sleep(sleep_time)
    processes = [proc for proc in processes if proc.poll() is None]


cmd = 'cat runCommands.sh'
job_list = ((cmd.format(n=i)).split() for i in range(5))
submit_job_max_len(job_list, max_processes=10)

我不明白最后3行代码到底在做什么。我的测试运行表明,range(n)中的数字将在每行中执行那么多次。因此,如果数字是5,那么每一行都执行5次。我不想这样。有人能帮我解释一下吗。再一次,请原谅我的无知。

EN

回答 2

Stack Overflow用户

发布于 2018-02-19 08:43:57

GNU Parallel是为您制作的:

代码语言:javascript
复制
cat the_file | parallel

默认情况下,它将在每个cpu核心上运行一个作业。这可以使用--jobs进行调整。

GNU Parallel是一个通用的并行化程序,可以很容易地在同一台机器上或在您有ssh访问权限的多台机器上并行运行作业。

如果您希望在4个CPU上运行32个不同的作业,那么一种直接的并行方法是在每个CPU上运行8个作业:

​

​

GNU并行在一个进程完成时会产生一个新的进程--保持CPU活动,从而节省时间:

​

​

Installation

出于安全原因,您应该与包管理器并行安装GNU,但是如果GNU Parallel没有为您的发行版打包,您可以进行个人安装,这不需要root访问权限。通过这样做,可以在10秒内完成:

代码语言:javascript
复制
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

了解更多信息

查看更多示例:http://www.gnu.org/software/parallel/man.html

观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

浏览教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel

票数 1
EN

Stack Overflow用户

发布于 2018-02-19 06:55:42

你需要的是一个队列。

使用多进程包启动一组进程。有几个例子说明了如何做到这一点。

一个巧妙的技巧是使用毒丸来确保一旦队列为空,每个进程都会被杀死。在本周的python模块中搜索有关这方面的示例。

祝你好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48857362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档