Maneira mais eficiente de executar 2 loops

9

Atualmente, uso dois whileloops diferentes para iniciar meu gerenciador de janelas, dwm , e a barra de status que imprime as informações do sistema nele.

Minha solução no momento é executá-los consecutivamente no mesmo script, assim:

while true; do
        $HOME/Scripts/dwm-status
        sleep 2s
    done &
while true; do
    dwm >/dev/null
done

Eu também vi como um whileloop aninhado , assim:

while true; do
        while true; do
            $HOME/Scripts/dwm-status
            sleep 2s
        done &
        dwm >/dev/null
    done

O segundo parece causar picos de CPU. Em termos de eficiência (menos recurso, etc.), qual é a melhor abordagem para executar esses dois loops e por quê?

jasonwryan
fonte

Respostas:

6

Não sei se estou apontando algo óbvio, mas a primeira maneira é criar dois loops que duram para sempre, enquanto o segundo é criar um loop infinito que cria loops infinitos, então você acabará com um loop sempre aumento do número de loops infinitos. Ele cria um loop infinito, executa o dwm e cria outro loop infinito - o primeiro loop infinito não parou. Cada passagem criará outro loop dwm-status, mesmo que os outros já estejam em execução ( while trueos manterá em execução indefinidamente)

Michael Mrozek
fonte
Obrigado Michael: não, não era óbvio, mais uma suspeita. Isso significa que a primeira abordagem é a correta ou existe uma maneira mais eficiente de fazer isso?
jasonwryan
@jasonwryan Bem, não sei exatamente o que você está tentando fazer. Por que você precisaria executar seu gerenciador de janelas várias vezes? Eu acho que você poderia apenas fundo dwmuma vez e, em seguida, executar dwm-statusem um loop
Michael Mrozek
1
Ele permite que você reinicie o dwm sem fechar os programas. É certo que eu uso-o com pouca frequência, mas, mesmo assim, é útil ... Veja: wiki.archlinux.org/index.php/… "
jasonwryan
1
@jasonwryan Uau, isso é extraordinariamente hackish :). Então sim, a primeira abordagem provavelmente é boa. Embora agora que compreenda a segunda maneira, ele só deva criar um novo loop de status dwm toda vez que você mata o dwm, o que suponho que não seja tão frequente, por isso não tenho certeza de que é realmente a causa dos seus problemas
Michael Mrozek