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
}
本质上:
- 创建命名管道以在
_abc
和的实例之间进行通信_check
。 - 阻止
_check
从管道读取(示例中为一个字节)。 - 从第一个开始
_check
,将一个字符(无论是哪个)打印到管道上。如果函数循环的话,这也许应该在函数外部完成。 - 让每个
_check
实例在退出时写回管道。
为了避免写入管道阻塞,我将管道添加为 shell 的打开文件描述符(请参阅https://unix.stackexchange.com/a/164295/70524)。另外,如果多个read
s 在同一个管道上排队,并且其中一个成功使管道为空,则其他将报告 EOF。为了克服这个问题,我们必须循环read
直到它成功读取。