Запустите несколько файлов Python одновременно и завершите все, когда один закончил - PullRequest
2 голосов
/ 22 марта 2019

Мне нужно запустить несколько файлов Python одновременно, но когда один из них завершится, уничтожьте все остальные. Мне нужно знать только вывод файла python, который заканчивается первым. После долгих проб и ошибок я решил использовать bash-файл (я использую Ubuntu), чтобы запустить все файлы одновременно, однако я не могу остановить их все, как только первый будет сделан. Пожалуйста, помогите, спасибо !!! Я перепробовал много ответов, которые нашел в Интернете, но безуспешно. Я даже написал файл python для уничтожения других файлов python, который работает при запуске из терминала, но не при вызове из файла bash или другого файла python. Я чувствую, что я слишком усложняю проблему. Любая помощь с благодарностью.

Предполагается, что я принимаю переменную с именем pass и передаю ее каждому файлу здесь команды, которые я хочу выполнять параллельно:

 read pass
 python3 1.py "$pass"
 python3 2.py "$pass"
 python3 3.py "$pass"
 python3 4.py "$pass"
 python3 5.py "$pass"
 python3 6.py "$pass"
 python3 7.py "$pass"
 python3 8.py "$pass"
 python3 9.py "$pass"

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Обновленный ответ

Спасибо за ваш вклад. В свете этого я бы предложил вам использовать:

parallel --dry-run -k --halt now,success=1 python3 {}.py "$pass" ::: {1..9}

Пример вывода

python3 1.py "$pass"
python3 2.py "$pass"
python3 3.py "$pass"
python3 4.py "$pass"
python3 5.py "$pass"
python3 6.py "$pass"
python3 7.py "$pass"
python3 8.py "$pass"
python3 9.py "$pass"

Если это выглядит правильно, вы можете удалить --dry-run и -k и просто запустить:

parallel --halt now,success=1 python3 {}.py "$pass" ::: {1..9}

Оригинальный ответ

Я думаю, что вы можете использовать для этого GNU Parallel , в частности политику halt . Так, в качестве примера, запустите 10 заданий, которые спят по 10, 20, 30, 40 ... 100 секунд каждое и убивают остальных, как только кто-нибудь добьется успеха:

parallel --halt now,success=1 sleep {} ::: $(seq 10 10 100)
parallel: This job succeeded:
sleep 10

Если вы добавите -k и --dry-run после parallel, вы увидите, что он запускает следующие задания:

parallel -k --dry-run --halt now,success=1 sleep {} ::: $(seq 10 10 100)

sleep 10
sleep 20
sleep 30
sleep 40
sleep 50
sleep 60
sleep 70
sleep 80
sleep 90
sleep 100

Еще один пример, который убивает выдающиеся рабочие места после достижения 20% рабочих мест:

parallel --halt now,success=20% sleep {} ::: $(seq 10 10 100)
parallel: This job succeeded:
sleep 10
parallel: This job succeeded:
sleep 20
3 голосов
/ 22 марта 2019

Вот небольшой пример того, как вы можете запускать многопользовательские скрипты Python параллельно. После первого скрипта выведите результат вывода, все остальные где будут убиты.

скрипт Python

import sys
import time
seconds = sys.argv[1]
time.sleep(int(seconds))
print("runner sleep {} seconds.".format(seconds))

скрипт bash

start() {                   # function for starting python scripts
    echo "start $@"         # print which runner is started
    "$@" &                  # start python script in background
    pids+=("$!")            # save pids in array
}

start ./runner.py 5         # start python scripts
start ./runner.py 7
start ./runner.py 1
start ./runner.py 2
start ./runner.py 3
start ./runner.py 9
start ./runner.py 8
start ./runner.py 3
start ./runner.py 4
start ./runner.py 7

wait -n "${pids[@]}"           # wait for first finished process
kill "${pids[@]}" 2>/dev/null  # kill all/other process

выход

start ./runner.py 5
start ./runner.py 7
start ./runner.py 1
start ./runner.py 2
start ./runner.py 3
start ./runner.py 9
start ./runner.py 8
start ./runner.py 3
start ./runner.py 4
start ./runner.py 7
runner sleep 1 seconds.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...