我们想要解释大量的坐标,并使用多个 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/