Fibras

Las fibras (fibers en inglés) son una forma de implementar concurrencia de una forma cooperativa. La clase Fiber se define en el módulo core.thread.

La idea básica es que cuando una fibra no tiene nada que hacer o está esperando por entrada del usuario, esta concede de forma activa su tiempo de ejecución para que otras tareas lo puedan usar llamando a la función Fiber.yeld(). El contexto padre obtiene el control, aunque el estado de dicha fibra (todas las variables que están en la pila) se guarda. La fibra puede reanudar su ejecución y continuar en la instrucción inmediatamente posterior a la de la llamada a Fiber.yield(). ¿Magia? Sí.

void foo() {
    writeln("Hola");
    Fiber.yield();
    writeln("mundo");
}
// ...
auto f = new Fiber(&foo);
f.call(); // Imprime 'Hola'.
f.call(); // Imprime 'mundo'.

Esta característica se puede usar para implementar concurrencia donde múltiples fibras comparten de forma cooperativa una única CPU. La ventaja de las fibras sobre los hilos de ejecución es que el uso de recursos de estas es menor ya que su uso no implica cambios de contexto.

Un buen uso de esta técnica se puede ver en el framework vibe.d que implementa operaciones de E/S de forma no bloqueante (o asíncronas) usando fibras, lo que lleva a código fuente mucho más limpio.

En profundidad

rdmd playground.d