bash - subshells de fila

1
function _abc {
:
1 min task
:
_check &
}

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

A função abc depende do número de tarefas. É imprescindível que _check seja em segundo plano porque a função abc precisa continuar funcionando e não esperar que a verificação de função seja concluída

Então, basicamente, o que eu preciso é que a verificação de função seja executada uma de cada vez e não todas juntas. Ou seja, as chamadas restantes da verificação de função devem ser enfileiradas e executadas uma de cada vez quando a anterior terminar.

    
por Brenden Carvalho 03.02.2016 / 18:45

1 resposta

4

A ideia de canais de Go pode ser usada aqui:

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
}

Essencialmente:

  1. Crie um canal nomeado para comunicação entre instâncias de _abc e _check .
  2. Ter _check block em uma leitura do pipe (um byte no exemplo).
  3. Inicie o primeiro _check imprimindo um caractere (não importa qual) para o pipe. Isso talvez deva ser feito fora da função se ela fizer um loop.
  4. Solicite que cada instância _check escreva de volta no canal ao sair.

Para evitar gravações no bloqueio de pipe, adicionei o pipe como um descritor de arquivo aberto ao shell (consulte link ). Além disso, se vários read s forem enfileirados no mesmo canal e um dos forçados deixar o canal vazio, os outros reportarão o EOF. Para superar isso, temos que fazer um loop em read até conseguir ler.

    
por 03.02.2016 / 19:23

Tags