Assincronismo e escalonamento cooperativo
Last updated
Last updated
Escrever código assíncrono pode levar a alguns desafios na forma como escrevemos o código do programa. A natureza assíncrona nos obriga a definir estruturas que encapsulam a lógica a ser executada em outro contexto (callbacks), quando o I/O ficar pronto, o que pode levar a múltiplos callbacks chamando outros callbacks de forma aninhada, causando o que chamamos de callback hell.
Nenhuma linguagem está livre disto, pensando de forma abstrata
E assim por diante...
Para mitigar este problema de indireção com assincronismo, podemos implementar técnicas funcionais como monads que lidam com tais efeitos colaterais. Por exemplo, estruturas como "async" e "await" presentes em algumas linguagens são uma forma de deixar o código mais "síncrono", encapsulando todo o efeito colateral do assincronismo em uma estrutura interna.
Desta forma, o código fica mais simples de manter, mitigando o problema com callback hell.
Outra forma de lidar com este problema é criando estruturas que permitem devolver o controle para o fluxo principal quando uma chamada de I/O assíncrono for identificada. Abstrações como corrotinas e fibers são vistas em diferentes linguagens para lidar com este problema.
Lembra do escalonamento cooperativo que vimos mais cedo no guia?
Então, com escalonamento cooperativo podemos fazer com que diferentes unidades de concorrência dentro do processo (coroutines ou fibers) possam cooperar com o uso de recursos, no caso I/O.
a corrotina delega controla para o loop com "yield", o que significa que ela ficará a espera de I/O
o loop não fica bloqueado e pode atender a outras corrotinas
quando o I/O fica pronto, o loop chama o "resume" na corrotina, devolvendo o controla e ela
Desta forma, I/O assíncrono e escalonamento cooperativo são grandes aliados para resolver o problema de assincronismo.
Ou copia e cola:
Se até aqui gostou do que escrevi, considera me pagar um cafezinho maroto? Gratidão que define