Нитки (Fibers)

Нитки - спосіб реалізації паралелізму шляхом співробітництва. Визначення класу Fiber наведено у модулі core.thread.

Основна ідея полягає у тому, що коли нитка залишається без діла або очікує на додаткові вхідні дані, вона добровільно віддає можливість виконувати інструкції іншим ниткам, викликаючи функцію Fiber.yield(). Коли батьківський контекст знов отримує управління, але стан нитки, а саме всі змінні на стеку, зберігається. Пізніше нитка може відновити свою роботу з інструкції яка слідує одразу-ж за викликом Fiber.yield(). Магія? Саме так!

void foo() {
    writeln("Привіт");
    Fiber.yield();
    writeln("Світ");
}
// ...
auto f = new Fiber(&foo);
f.call(); // Друкує "Привіт"
f.call(); // Друкує "Світ"

Ця можливість може бути використана для реалізації паралелізму, де безліч ниток спільно використовують єдине ядро. Перевага ниток у порівнянні з потоками полягає у більш економному використанні ресурсів завдяки відсутності змінного контексту.

Вдале використання цієї техніки можна побачити у фреймворку vibe.d, в якому реалізовані неблокуючі (або асинхронні) операції вводу/виводу у контексті ниток, що дозволяє створювати більш лаконічний код.

Поглиблення

rdmd playground.d