Bases et I/O asynchrone

Par défaut, la fonction main() d'une application vibe.d est spécifiée dans un constructeur de module spécial shared static this():

import vibe.d;

shared static this()
{
    // code vibe.d ici
}

Un constructeur de module est exécuté une fois avant main(). Vibe.d implémente sa propre fonction main() qui cache les mécaniques internes à l'utilisateur.

Vibe.d utilise les fibres pour implémenter l'E/S asynchrone: chaque fois qu'un appel à un socket est bloquant, parce qu'on a pas de données à lire par exemple, la fibre courante appelle yield et rend l'exécution à une autre opération. Quand les données sont disponibles, on reprend l'exécution:

// Pourrait bloquer, mais vibe.d s'assure que
// l'on reprenne ici quand le socket est près
line = connection.readLine();
// Peut bloquer aussi
connection.write(line);

Le code a l'air synchrone et bloquerait normalement le thread courant, mais il ne le fait pas ! Le code est propre et concis, mais il utilise quand même la puissance de l'E/S asynchrone, qui nous permet de gérer des milliers de connexions sur un seul cœur.

Toutes les fonctionnalités de vibe.d utilisent les opérations asynchrones sur les sockets basés sur les fibres pour que nous n'ayons pas besoin de nous inquiéter qu'une connexion lente à MongoDB bloque toute notre application.

Regardez l'exemple qui montre comment implémenter un simple serveur echo basé sur TCP.

rdmd playground.d