* On retourne à `block_on()` dans le `main()` et on attend le prochain réveil pour rappeler `poll()`
## Amélioration 1: éviter le sondage actif (6/)
## Amélioration 1: éviter le sondage actif 6/
```console
Program starting
...
...
@@ -219,4 +219,343 @@ HelloAsyncAwait
* Ajouter un Réacteur qui va gérer les `Waker` qui va être responsable de la communication avec l'exécuteur
## Amélioration 2: ajouter un réacteur et un waker (1/)
## Amélioration 2: ajouter un exécuteur, un réacteur et un waker
* On sépare le `Runtime` en `Reactor` et `Executor`
* On ajoute un `Waker` pour faire le lien entre les deux
* On doit modifier `Future` pour prendre en compte le `Waker`
### Le nouveau `main()`
```rust
fnmain(){
letmutexecutor=runtime::init();
executor.block_on(async_main());
}
```
* Très similaire à la version précédente
## Amélioration 2: ajouter un `Executor`
### L'exécuteur aura comme capacités
* Stocke les `Future` du plus haut niveau
* Permet de créer des `Future` de haut niveau dans notre programme asynchrone
* Permet d'avoir plusieurs exécuteurs chacun sur son propre thread système
* Distribuer les `Waker` pour que les tâches puissent dormir quand il n'y a rien à faire et se réveiller quand un des futurs de haut niveau peut progresser
### Ce qu'il ne fera pas
* Ne sera pas vraiment multi-threadé: pas de communication entre les threads possible (pas moyen de "voler" des tâches)
* Chaque exécuteur est agnostique des autres (pas besoin d'avoir `Sync` et `Send` qui est satisfait)