Menu

Основы и асинхронный ввод/вывод

При использовании параметров сборки по умолчанию, функция main() для приложения vibe.d назначается при помощи специального конструктора модуля, shared static this():

import vibe.d;
shared static this() {
    // код Vibe.d
}

Конструктор модуля исполняется один раз перед вызовом main(). Vibe.d содержит собственную функцию main() и скрывает от пользовательского кода цикл обработки событий и всю остальную "работу по дому".

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

// Возможна блокировка, но она происходит
// незаметно. Если сокет готов, vibe.d
// вернёт результат.
line = connection.readLine();
// Также возможна блокировка
connection.write(line);

Таким образом, код выглядит так, словно он синхронный, т.е. будет блокировать текущий поток, но на самом деле этого не происходит! Код выглядит чистым и опрятным, хотя на самом деле использует всю мощь асинхронного ввода/вывода, позволяя обрабатывать тысячи соединений на одном ядре процессора.

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

Не забудьте ознакомиться с примером, демонстрирующим, как создать простой TCP эхо-сервер.

rdmd playground.d