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.