Menu

Волокна

Волокна - это метод реализации одновременного исполнения в кооперативном стиле. Класс Fiber определён в модуле core.thread.

Основная идея состоит в том, что когда волокну нечего исполнять или оно ожидает нового ввода, оно активно передаёт возможность исполнения инструкций посредством вызова Fiber.yield(). Родительский контекст вновь получает управление, но состояние волокна - все переменные в стеке - сохраняется. В дальнейшем волокно можно возобновить, и оно продолжит исполняться с инструкции, следующей за вызовом Fiber.yield(). Магия? Да.

void foo() {
    writeln("Hello");
    Fiber.yield();
    writeln("World");
}
// ...
auto f = new Fiber(&foo);
f.call(); // Выводит Hello
f.call(); // Выводит World

Эту возможность можно использовать для реализации одновременного исполнения, при котором несколько волокон в кооперативном режиме работают на одном ядре. Преимуществом волокон перед потоками является то, что объём потребляемых ими ресурсов меньше, поскольку не производятся переключения контекста.

Отличное применение данной техники можно увидеть на примере фреймворка vibe.d, реализующего неблокирующие (асинхронные) операции ввода-вывода на основе волокон, предоставляя более чистый код.

Подробнее

rdmd playground.d