Skip to content

Instantly share code, notes, and snippets.

@akscram
Created December 11, 2012 21:22
Show Gist options
  • Save akscram/4262237 to your computer and use it in GitHub Desktop.
Save akscram/4262237 to your computer and use it in GitHub Desktop.
#!/bin/bash
function scheduler() {
local -i fd=$1 worker_id= worker_fd=
# local -a workers=$2
local task=
echo "Scheduler started"
while read task
do
echo "Scheduler readed task \"$task\""
read -u $fd worker_id
echo "Scheduler readed free worker id \"$worker_id\""
echo $workers
echo ${workers[1]}
worker_fd=${workers[$worker_id]}
echo "Schedule found free worker[$worker_id,$worker_fd]"
eval "echo \"$task\" >&$worker_fd"
echo "Scheduler send task to worker[$worker_id,$worker_fd]"
done
}
function worker() {
local -i id=$1 fd=$2 queue_fd=$3
local task=
echo "Worker[$id,$fd] started"
eval "echo $id >&$queue_fd"
while read -u $fd task
do
if [[ -z $task ]]
then
echo "Worker[$id,$fd] ended"
break
fi
echo "Worker[$id,$fd] task \"$task\" readed"
eval $task
echo "Worker[$id,$fd] task \"$task\" executed"
eval "echo $id >&$queue_fd"
echo "Worker[$id,$fd] free"
done
}
function main() {
local -i queue_fd=$1 workers_num=$2
local -a workers=()
local -i i= worker_fd=
local pipes_dir= queue_pipe= worker_pipe=
pipes_dir=$(mktemp -d /tmp/pshed.XXXXX)
queue_pipe="$pipes_dir/$queue_fd"
mkfifo $queue_pipe
eval "exec $queue_fd<> $queue_pipe"
for ((i=0; i<$workers_num; i++))
do
worker_fd=$(($queue_fd + $i + 1))
worker_pipe="$pipes_dir/$worker_fd"
mkfifo $worker_pipe
workers[$i]=$worker_fd
echo "Initialized worker ${workers[$i]}"
eval "exec $worker_fd<> $worker_pipe"
worker $i $worker_fd $queue_fd &
done
echo "Started scheduler with workers $workers"
# scheduler $queue_fd $workers <&0
scheduler $queue_fd <&0
eval "exec $queue_fd>&-"
for worker_fd in ${workers[@]}
do
eval "exec $worker_fd>&-"
echo > "$pipes_dir/$worker_fd"
done
}
main 4 $1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment