【问题标题】:parallel processing of python scriptpython脚本的并行处理
【发布时间】:2018-09-04 14:38:15
【问题描述】:

我有一个 python 脚本,它一次接受一个输入并处理它。 我想同时运行与不同输入并行的脚本。像 50 或 100 次,但输入来自 txt 文件。

我执行如下脚本:

python script.py -d url1 

然后

python script.py -d url2

然后

python script.py -d url3

而不是一次输入一个参数,我想从文本文件中提供这些 url 并并行处理它们。

我尝试使用 gnu-parallel 在 bash shell 中运行此脚本,但 bash 脚本不运行 python shell,因此出现错误。

代码如下---

#!/usr/bin/env bash
doit() {
    host="$1"
    ~/script/python script1.py -d $host
      }
   export -f doit

   cat "$1" | parallel -j50 -k doit 

txt文件内容---

url1.com
url2.com
url3.com
--------
url1000.com
url_any.com

【问题讨论】:

  • 我投了反对票,因为似乎没有进行任何研究尝试。
  • 我尝试使用 gnu 并行运行它,但在此之前,我在 bash 脚本中并行运行,就像 go 语言接受的那样,但这需要 python 中的 shell,因此我无法运行它。

标签: python parallel-processing multiprocessing gnu-parallel


【解决方案1】:

使用 GNU Parallel,像这样:

parallel --dry-run -a arguments.txt python script.py

假设您的参数是"arguments.txt" 中的每行一个。

如果需要,请使用 parallel -k ... 保持输出有序。

使用parallel --bar ... 获取进度条。

【讨论】:

  • python 脚本本身采用类似“python script1.py -d abc”的参数
  • 不确定我是否理解。只需在最后添加您需要的任何参数。请在您的问题下单击edit,并显示您的"arguments.txt" 文件的3 行,然后显示应执行的3 个相应命令。
  • 我试过你的代码,它只是输出文本所需的命令,而不是执行那个特定的命令,比如“python script.py - d any.com”
  • 如果输出看起来正确,请再次运行它,但不要使用用于调试的--dry-run
  • 是的,它的工作原理,它可以像 -j50 或 -j100 这样的参数来控制输入。
【解决方案2】:

GNU Parallel 的替代方法是使用 Python subprocess 重复执行命令。

这是一个使用 Python 2.7 的示例。

首先,您的代码需要读取文本文件以将所有参数分配给一个列表。

with open('<Arguments text file location>') as f:
    arguments = f.read().splitlines()

然后,您使用循环为使用子进程的每个参数运行一次命令。

import subprocess
procs = []
for argument in arguments:
    cmd = 'python script.py %(argument)' % {'argument': argument}
    procs.append(
        subprocess.Popen(cmd, shell=True)
    )
exit_codes = [p.wait() for p in procs]

【讨论】:

  • 如果没有。参数是 1000,这会创建 1000 个 shell 进程,对吗?这有什么好担心的吗?我们可以在不崩溃的情况下生成子进程的数量是否有任何限制?
  • AFAIK 限制是你的 CPU 和内存。你需要为此做一些基准测试。
猜你喜欢
  • 1970-01-01
  • 2018-12-05
  • 2013-10-10
  • 2012-09-16
  • 2016-09-30
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
相关资源
最近更新 更多