gpt4 book ai didi

bash - 多个 shell 脚本 worker

转载 作者:行者123 更新时间:2023-11-29 09:42:21 30 4
gpt4 key购买 nike

我们想要解释大量的坐标,并使用多个 worker 对它们进行处理。我们得到了什么:

坐标.txt

100, 100, 100
244, 433, 233
553, 212, 432
776, 332, 223
...
8887887, 5545554, 2243234

worker.sh

coord_reader='^([0-9]+), ([0-9]+), ([0-9]+)$'
while IFS='' read -r line || [[ -n "$line" ]]; do
if [[ $line =~ $coord_reader ]]; then

x=${BASH_REMATCH[1]}
y=${BASH_REMATCH[2]}
z=${BASH_REMATCH[3]}
echo "x is $x, y is $y, z is $z"
fi

done < "$1"

要执行 worker.sh,我们调用 bash worker.sh coords.txt

Bc 我们有数百万个坐标,需要拆分 coords.txt 并创建多个执行相同任务的工作人员,例如每个 coordsaa、coordsab、coordsac 1名 worker 。

所以我们使用split拆分coords.txt

split -l 1000 coords.txt coords

但是,如何为每个 worker 分配一个文件?

我是 stackoverflow 的新手,请随时发表评论,以便我提高提问技巧。

最佳答案

从 bash 运行 worker 来处理大量文件:

文件架构:

files/ runner.sh worker.sh 

files/ : 这是一个有很多文件的文件夹(例如1000个)
runner.sh: 启动一个worker
worker.sh 文件:处理一个文件的任务

例如:

worker.sh:

#!/usr/bin/env bash

sleep 5
echo $1

要运行 files/ 中的所有文件,每个 worker 执行一个:

runner.sh:

#!/usr/bin/env bash

n_processes=$(find files/ -type f | wc -l)
echo "spawning ${n_processes}"

for file in $(find . -type f); then
bash worker.sh "${file}" &
done

wait

/!\ 1000 processes is a lot !!

最好创建一个“进程池”(这里它只保证同时运行的进程的最大数量,旧的子进程不会被新任务重用,而是在其任务完成或失败时死亡):

#!/usr/bin/env bash

n_processes=8
echo "max of processes: ${n_processes}"

for file in $(find files/ -type f); do
while [[ $(jobs -r | wc -l) -gt ${n_processes} ]]; do
:
done
bash worker.sh "${file}" &
echo "process pid: $! finished"
done

wait

它不是真正的进程池,但它避免了同时存在大量进程,同时存在的最大进程数由 n_processes 给出。

执行bash runner.sh

关于bash - 多个 shell 脚本 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44740137/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com