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