bash done 53 lines
parent
4e75ec8771
commit
a8edc611cd
|
|
@ -0,0 +1,63 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
main() {
|
||||||
|
set -e
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
if jobs -p | grep -q .; then
|
||||||
|
kill -9 $(jobs -p) &> /dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
export _D="$(mktemp -d)"
|
||||||
|
export _P=3
|
||||||
|
export _N=100
|
||||||
|
|
||||||
|
for i in $(seq 0 $((_P-1))); do
|
||||||
|
mkfifo "$_D/pipe.$i"
|
||||||
|
done
|
||||||
|
|
||||||
|
scatter
|
||||||
|
gather
|
||||||
|
|
||||||
|
rm -rf "$_D"
|
||||||
|
}
|
||||||
|
|
||||||
|
scatter() {
|
||||||
|
for i in $(seq 0 $((_P-1))); do
|
||||||
|
_scatter $i &
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_scatter() {
|
||||||
|
local i="$1"
|
||||||
|
local chunk=$((_N/_P))
|
||||||
|
local start=$((chunk*i))
|
||||||
|
if ((i==_P-1)); then
|
||||||
|
chunk=$((chunk+_N%_P))
|
||||||
|
fi
|
||||||
|
local result=0
|
||||||
|
for j in $(seq $start $((start+chunk))); do
|
||||||
|
((result+=j)) || true
|
||||||
|
done
|
||||||
|
echo "> _scatter $i processing $start..$((start+chunk)) found $result" >&2
|
||||||
|
echo $result > "$_D/pipe.$i"
|
||||||
|
}
|
||||||
|
|
||||||
|
gather() {
|
||||||
|
echo "> gather..." >&2
|
||||||
|
local ttl=0
|
||||||
|
for f in "$_D"/pipe.*; do
|
||||||
|
echo "> cat $f" >&2
|
||||||
|
ttl=$((ttl+$(timeout 1 cat "$f" || echo 0)))
|
||||||
|
done
|
||||||
|
echo "> wait" >&2
|
||||||
|
wait
|
||||||
|
echo "> /gather $ttl" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$0" == "$BASH_SOURCE" ]; then
|
||||||
|
main "$@"
|
||||||
|
fi
|
||||||
Loading…
Reference in New Issue