Skip to content

Commit 7cf48de

Browse files
Update article.md
1 parent cdaf839 commit 7cf48de

File tree

1 file changed

+22
-23
lines changed

1 file changed

+22
-23
lines changed

2-ui/99-ui-misc/03-event-loop/article.md

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,50 @@
11

22
# Event loop: microtasks e macrotasks
33

4-
Il flusso di esecuzione di Javascript, così come quello di Node.js, è basato sull' *event loop*.
4+
Sia il flusso di esecuzione di Javascript, che quello di Node.js, sono basati sull' *event loop*.
55

6-
Comprendere come funziona un event loop è importante sia per ottimizzazione, ma a volte, anche per creare delle architetture migliori.
6+
Comprendere come funziona un event loop è importante sia per una question di ottimizzazione dell'esecuzione del codice, ma a volte, anche per creare delle architetture migliori.
77

8-
In questo capitolo affronteremo i dettagli teorici sul funzionanento, dopodichè prenderemo in esame alcune applicazioni pratiche.
8+
In questo capitolo affronteremo l dettagli teorici sul funzionanento, dopodichè prenderemo in esame alcune applicazioni pratiche.
99

1010
## Event Loop
1111

12-
Il concetto di *event loop* è molto semplice. Esiste un loop infinito nel quale il motore di Javascript rimane in attesa di un task (operazione) da eseguire, lo esegue, dopodichè si rimette in attesa per altri tasks. (in sleep, inattivo o dormiente, ma pronto per essere di nuovo richiamato).
12+
Il concetto di *event loop* è molto semplice. Esiste un loop infinito, nel quale il motore di Javascript rimane in attesa di un task (compito, operazione) da eseguire, lo esegue, dopodichè si rimette in attesa per altri tasks. (rimane in sleep, inattivo o dormiente, ma pronto per essere di nuovo richiamato).
1313

14-
Questo, è a grandi linee, l'algoritmo del motore:
14+
A grandi linee, l'algoritmo del motore è così:
1515
1. Fino a quando ci sono task:
1616
- eseguili, cominciando da quello meno recente.
1717
2. Rimani in attesa fino a quando non c'è un altro task da eseguire, quindi vai al passo 1.
1818

19-
Questa è una esposizione di quello che vediamo quando navighiamo una pagina. Il motore di Javascript non fa nulla per la maggior parte del tempo, e va in esecuzione quando si attiva uno script/handler/evento.
19+
Questa è una trasposizione di quello che vediamo quando navighiamo in una pagina web. Il motore di Javascript non fa nulla per la maggior parte del tempo, e va in esecuzione quando si attiva uno script/handler/evento.
2020

2121
Esempio di tasks:
2222

23-
- Quando uno script esterno `<script src="...">` viene caricato (load), il task &egrave; quello di eseguirlo.
24-
- Quando un utente sposta il puntatore del mouse, il task &egrave; quello di fare il dispatch dell'evento `mousemove` ed eseguirne eventuali handlers (gestori).
23+
- Quando viene caricato uno script esterno `<script src="...">` (load), il task &egrave; quello di eseguirlo.
24+
- Quando un utente sposta il puntatore del mouse, il task &egrave; quello di lanciare il dispatch dell'evento `mousemove` ed eseguirne eventuali handlers (gestori).
2525
- Quando &egrave; scaduto il tempo per `setTimeout` gi&agrave; schedulato, il task &egrave; quello di eseguirne la callback.
2626
- ...e cos&igrave; via.
2727

28-
I task vengono impostati -- il motore li gestisce -- quindi rimane in attesa per altri tasks (nel frattempo rimane in sleep, consumando risorse della CPU prossime allo zero).
28+
I task vengono impostati -- il motore li gestisce -- quindi rimane in attesa per altri tasks (nel frattempo rimane in sleep, consumando risorse CPU prossime allo zero).
2929

3030
Per&ograve; potrebbe succedere che mentre il motore &egrave; occupato, arrivi un task, in questo caso, questo viene messo in coda.
3131

32-
I task formano una coda, la cosiddetta "macrotask queue" (termine mutuato V8, il motore Javascript di Chrome e di Node.js):
32+
I task formano una coda, la cosiddetta "macrotask queue" (termine mutuato da V8, il motore Javascript di Chrome e di Node.js):
3333

3434
![](eventLoop.svg)
3535

36-
Ad esempio, se mentre il motore &egrave; occupato nell'esecuzione di uno `script`, l'utente muove il mouse generando un `mousemove`, e magari nello stesso istante &egrave; scaduto il tempo di un `setTimeout`, questi task formano una queue (una coda di esecuzione) come illustrato nella figura di sopra.
36+
Ad esempio se, mentre il motore &egrave; occupato nell'esecuzione di uno `script`, l'utente muove il mouse generando un `mousemove`, e magari nello stesso istante &egrave; scaduto il tempo di un `setTimeout`, questi task formano una queue (una coda di esecuzione) come illustrato nella figura appena sopra.
3737

38-
I task dalla coda vengono processati sulla base del "first come – first served", cio&egrave; secondo l'ordine che il primo arrivato sar&agrave; il primo ad essere servito (FIFO).
39-
Quando il motere del browser avr&agrave; terminato con lo `script`, gestir&agrave; l'evento `mousemove`, quindi si occuper&agrave; del gestore del `setTimeout` (la callback), e cos&igrave;
38+
I tasks dalla coda vengono processati sulla base del "first come – first served", cio&egrave; secondo l'ordine per cui il primo arrivato sar&agrave; il primo ad essere servito (FIFO).
39+
Quando il motoere del browser avr&agrave; terminato con lo `script`, gestir&agrave; l'evento `mousemove`, quindi si occuper&agrave; del gestore del `setTimeout` (la callback), e via dicendo.
4040

4141
Fino a qui abbastanza semplice, giusto?
4242

4343
Ancora due dettagli:
4444
1. Il rendering non avviene mai quando il motore sta eseguendo un task. Non importa se questo impiega molto tempo. I cambiamenti al DOM vengono renderizzati (ridisegnati sul browser) solo dopo che il task viene completato.
45-
2. Se un task impiega troppo tempo, il browsere non pui&ograve; eseguire altri taskm, processare eventi utente, e cos&igrave; dopo un certo periodo di tempo viene scaturito un alert di "Pagina bloccata"(Page Unresponsive) che ci suggerisce di terminare il task con l'intera pagina. Questo succede in concomitanza di una serie di calcoli complessi, o degli errori di programmazione che portano ad un loop infinito.
45+
2. Se un task impiega troppo tempo, il browser non pui&ograve; eseguire altri tasks, processare altri eventi utente, e cos&igrave; dopo un certo periodo di tempo viene scaturito un alert di "Pagina bloccata" (Page Unresponsive) che ci suggerisce di terminare il task e l'intera pagina. Questo succede in concomitanza di una serie di calcoli complessi, o in seguito ad errori di programmazione che portano loop infiniti.
4646

47-
Questa era la teoria. Adesso vediamo come applicare questi concetti.
47+
Questa era la teoria, ma vediamo come applicare questi concetti.
4848

4949
## Caso d'uso 1: Spezzettamento di task affamati di CPU (processi intensivi)
5050

@@ -55,11 +55,11 @@ Per evidenziare il codice, compie delle analisi, crea molti elementi colorati, e
5555

5656
Mentre il motore &egrave; occupato con l'evidenziatura, non pu&ograve; fare le altre cose relative al DOM, processare gli eventi dell'utente, etc. pu&ograve; persino causare "singhiozzamenti" al pc o addirittura "inchiodarlo", la qual cosa &egrave; inaccettabile.
5757

58-
Possiamo quindi tirarci fuori da questo tipo di problemi, spezzettando i task grossi in piccoli pezzi. Evidenzia le prime 100 righe, quindi schedula un `setTimeout` (con zero-delay) con altre 100 righe, e cos&igrave; via.
58+
Possiamo quindi tirarci fuori da questo tipo di problemi, spezzettando i task grossi in piccoli pezzi. Evidenzia le prime 100 righe, quindi schedula un `setTimeout` (con zero-delay) con altre 100 righe, e cos&igrave; via fino alla fine.
5959

60-
Per dimostrare questo tipo di approccio, per amore della semplicit&agrave;, invece di evidenziare una sintassi, prendiamo una funzione che conti i numeri da `1` a `1000000000`
60+
Per dimostrare questo tipo di approccio, e per amore della semplicit&agrave;, anzich&egrave; evidenziare una sintassi, prendiamo una funzione che conti i numeri da `1` a `1000000000`
6161

62-
Se esegui il codice sotto, il motore si inchioder&agrave; per qualche istante. Per il JS server-side (lato server) questo &egrave; chiaramente visibile, e se lo stai eseguendo nella finestra del browser, prova a cliccare gli altri pulsanti -- potrei notare che non verr&agrave; gestito nessun altro evento fino a quando il conto non sar&agrave; terminato.
62+
Se esegui il codice sotto, il motore si inchioder&agrave; per qualche istante. Per il JS server-side (lato server) questo &egrave; chiaramente visibile, ma se lo stai eseguendo nella finestra del browser, provando a cliccare gli altri pulsanti -- potrai notare che non verr&agrave; gestito nessun altro evento fino a quando il conto non sar&agrave; terminato.
6363

6464
```js run
6565
let i = 0;
@@ -80,8 +80,7 @@ count();
8080
Il browser potrebbe anche mostrare l'avviso "lo script sta impiegando troppo tempo" the script takes too long".
8181

8282

83-
84-
Ora, dividiamo l'operazione usando un `setTimeout` annidato:
83+
Ora, dividiamo l'operazione con l'ausilio di un `setTimeout` annidato:
8584

8685
```js run
8786
let i = 0;
@@ -302,10 +301,10 @@ L'immagine pi&ugrave; esausitva di un event loop &egrave; questa:
302301

303302
Il pi&ugrave; dettagliato algoritmo dell'event loop (sebbene ancora semplicistico rispetto alla [specification](https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model)):
304303

305-
1. Rimuovi dalla coda ed esegui, il pi&ugrave; vecchio task dalla coda dei *macrotask* (ad esempio "script").
306-
2. Eseguit tutti i *microtasks*:
304+
1. Rimuovi dalla coda ed esegui il task meno recente dalla coda dei *macrotask* (ad esempio "script").
305+
2. Esegui tutti i *microtasks*:
307306
- Se la cosa dei microtask non &egrave; vuota:
308-
- Rimuovi dalla coda ed esegui il pi&ugrave; vecchio dei microtask.
307+
- Rimuovi dalla coda ed esegui il meno recente dei microtask.
309308
3. Renderizza le modifiche se ve ne sono.
310309
4. Se la coda dei macrotask &egrave; vuota, vai in sleep fino al prossimo macrotask.
311310
5. Vai al passo 1.

0 commit comments

Comments
 (0)