实现思路
实现一个shell进程库,通过类似于init
,run
,wait
几个简单的命令,就可以迅速实现多进程并发,伪码如下:
process_init # 创建进程
for city in ${cities[*]}
do
cmd="handler $city"
process_run $cmd
done
process_wait # 等待进程
原理解析
在实现C++线程库的时候,通常会有一个任务队列,线程从队列中取任务并运行。在实现shell进程库的时候,采用了类似原理,通过一个有名管道
充当任务队列。严格来说,并不是一个任务队列,而是一个令牌桶。进程从桶中取得令牌后才可以运行,运行结束后将令牌放回桶中。没有取得令牌的进程不能运行。令牌的数目即允许并发的最大进程数。
管道
主要思路:通过mkfifo
创建一个有名管道,将管道与一个文件描述符绑定,通过往管道中写数据的方式,控制进程数量。
function _create_pipe()
{
_PROCESS_PIPE_NAME=$(_get_uid)
mkfifo ${_PROCESS_PIPE_NAME}
eval exec "${_PROCESS_PIPE_ID}""<>${_PROCESS_PIPE_NAME}"
for ((i=0; i < $_PROCESS_NUM; i++))
do
echo -ne "\n" 1>&${_PROCESS_PIPE_ID}
done
}