function _abc {
:
1 min task
:
_check &
}
function _check {
wait for the previous calls of _check to complete
:
15 mins task
:
}
関数 abc はジョブ数に応じて繰り返されます。関数abcは関数チェックが完了するのを待たずに動作を続ける必要があるため、_checkはバックグラウンドで実行する必要があります。
したがって、基本的に私に必要なのは、機能チェックをすべて一度に実行するのではなく、一度に1つずつ実行することです。つまり、機能チェックの残りの呼び出しはキューに追加され、前の呼び出しが完了した後に一度に1つずつ実行する必要があります。
答え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
パイプからの読み取りをブロックします(例では1バイト)。- 最初の文字から始めて、
_check
パイプに1つの文字を印刷します。関数が繰り返される場合は、おそらく関数の外で実行する必要があります。 - 各
_check
インスタンスが終了時にパイプに書き換えられるようにします。
書き込みパイプをブロックするのを防ぐために、パイプをシェルのオープンファイル記述子として追加しました(参照:https://unix.stackexchange.com/a/164295/70524)。さらに、複数のread
sが同じパイプで待機していて、その1つがパイプを正常に空にすると、他のsはEOFを報告します。この問題を克服するには、read
正常に読むまで繰り返す必要があります。