# Assincronismo e escalonamento cooperativo

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

```
fn processData(callback):
  callToAction(callback() {
  }, anotherCallback {
  }, yetAnotherCallback {
  })...
```

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.

<figure><img src="/files/lf6qACQbfuiCcqU8EzV8" alt=""><figcaption></figcaption></figure>

* 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**.

***

### Está gostando deste meu trabalho? Buy me a coffee?

Se até aqui gostou do que escrevi, considera me pagar um cafezinho maroto? Gratidão que define :heart:

<figure><img src="/files/FUUkoZLpU19gvljXPbr1" alt="" width="283"><figcaption></figcaption></figure>

Ou copia e cola:

```
00020126850014BR.GOV.BCB.PIX013638ee4bde-574b-4197-b10f-68742087b00b0223Gratidão pelo cafezinho5204000053039865802BR5925Leandro Freitas Maringolo6009SAO PAULO62140510qrN6Ov1wRl63041A3C
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://concorrencia101.leandronsp.com/parte-i-concorrencia-no-sistema-operacional/e-o-i-o/assincronismo-e-escalonamento-cooperativo.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
