Shell 实现多任务并发

本文详细介绍了如何使用Shell实现多任务并发,通过创建有名管道控制进程数量,利用`exec`和`eval`实现变量扩展,探讨了进程创建、进程组、wait函数的使用,并提供了信号处理和清理函数的实现示例。
摘要由CSDN通过智能技术生成

实现思路

实现一个shell进程库,通过类似于initrunwait几个简单的命令,就可以迅速实现多进程并发,伪码如下:

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
}
exec
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值