同时运行多个python文件,并在完成后终止所有文件

时间:2019-03-22 12:55:50

标签: python linux bash

我需要同时运行多个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 个答案:

答案 0 :(得分:3)

这是一个如何并行启动多重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.

答案 1 :(得分:3)

更新后的答案

感谢您的投入。鉴于这些,我建议您使用:

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 ,特别是其暂停政策。因此,举例来说,开始10个工作,每个工作分别睡10、20、30、40 ... 100秒,并在任何一个成功后立即杀死其他人:

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

如果在-k之后添加--dry-runparallel,您将看到它启动了以下作业:

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