bash - 队列子shell

bash - 队列子shell
function _abc {
:
1 min task
:
_check &
}

function _check {
wait for the previous calls of _check to complete
:
15 mins task
:
}

函数 abc 根据任务数量循环。 _check 必须在后台运行,因为函数 abc 需要继续工作而不是等待函数检查完成

所以基本上,我需要的是功能检查一次运行一个,而不是一起运行。也就是说,函数检查的剩余调用应该排队,并在前一个调用完成后一次运行一个。

答案1

Go 的通道理念可以在这里使用:

mkfifo my_pipe
exec 3<>my_pipe
trap 'rm my_pipe' EXIT
printf a >&3
function _abc {
    ...
    _check &
}

function _check {
    until read -N1 -u3; do :; done
    ...
    printf a >&3
}

本质上:

  1. 创建命名管道以在_abc和的实例之间进行通信_check
  2. 阻止_check从管道读取(示例中为一个字节)。
  3. 从第一个开始_check,将一个字符(无论是哪个)打印到管道上。如果函数循环的话,这也许应该在函数外部完成。
  4. 让每个_check实例在退出时写回管道。

为了避免写入管道阻塞,我将管道添加为 shell 的打开文件描述符(请参阅https://unix.stackexchange.com/a/164295/70524)。另外,如果多个reads 在同一个管道上排队,并且其中一个成功使管道为空,则其他将报告 EOF。为了克服这个问题,我们必须循环read直到它成功读取。

相关内容