Fibras são uma forma de implementar a concorrência
de forma cooperativa. A classe Fiber
é definida no módulo core.thread
.
A ideia básica é que, quando uma fibra
não tem nada para fazer ou espera por mais entrada, ela
ativamente abre mão de sua possibilidade de
executar instruções chamando Fiber.yield()
.
O contexto principal ganha controle novamente,
mas o estado da fibra - todas as variáveis na pilha - são
salvas. A fibra pode então ser retomada
e continuará na instrução logo depois de chamar Fiber.yield()
.
void foo() {
writeln("Hello");
Fiber.yield();
writeln("World");
}
// ...
auto f = new Fiber(&foo);
f.call(); // Imprime Hello
f.call(); // Imprime World
Esse recurso pode ser usado para implementar a concorrência em que várias fibras compartilham cooperativamente um único núcleo. A vantagem das fibras em relação as threads é que seu uso de recursos é menor porque não há troca de contexto envolvida.
Um uso muito bom dessa técnica pode ser visto em vibe.d, que implementa operações de E/S não bloqueantes (ou assíncronas) em termos de fibras, o que resulta em um código muito mais limpo.