我们想解释成吨的坐标,并用多个工人来处理它们。
我们得到的:
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/

10-14 17:23