我们想解释成吨的坐标,并用多个工人来处理它们。
我们得到的:
coords.txt文件
100, 100, 100
244, 433, 233
553, 212, 432
776, 332, 223
...
8887887, 5545554, 2243234
工人.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并创建多个执行相同任务的worker,比如每个worker。
所以我们使用
coordsaa, coordsab, coordsac
分割coords.txt
。split -l 1000 coords.txt coords
但是,如何为每个工人分配一个文件?
我是新来的stackoverflow,请随意评论,这样我可以提高我的提问技巧。
最佳答案
运行bash中的workers来处理大量文件:
文件体系结构:
files/ runner.sh worker.sh
files/
:它是一个包含大量文件的文件夹(例如1000)runner.sh
:发动大量工人worker.sh file
:处理文件的任务例如:
工人.sh:
#!/usr/bin/env bash
sleep 5
echo $1
要在
files/
中为每个工人运行一个文件,请执行以下操作: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道工序太多了!!
最好是创建一个“流程池”(在这里,它只保证同时运行的进程的最大数量,旧的子进程不能重用新任务,但在任务完成或失败时死亡):
#!/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/