параллельная обработка скрипта Python - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть скрипт на python, который принимает один вход за раз и обрабатывает его. Я хочу запускать сценарий параллельно с разными входами одновременно. Как 50 или 100 раз, но с разными входными данными из текстового файла.

я выполняю скрипт как:

python script.py -d url1 

тогда

python script.py -d url2

тогда

python script.py -d url3

и вместо ввода по одному аргументу за раз, я хочу получить эти URL из текстового файла и обрабатывать их параллельно.

Я пытался запустить этот скрипт в оболочке bash, используя gnu -rallel, но скрипт bash не запускает оболочку python и, следовательно, ошибки.

код выглядит следующим образом ---

#!/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

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

С GNU Parallel , вот так:

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

, который предполагает, что ваши аргументы по одному в строке в "arguments.txt".

Используйте parallel -k ... для поддержания выходов в порядке, если это необходимо.

Используйте parallel --bar ..., чтобы получить индикатор выполнения.

0 голосов
/ 04 сентября 2018

Альтернативой GNU Parallel является использование Python подпроцесс для многократного выполнения команды.

Это пример использования 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]
...