При запуске цикла событий в libuv с использованием функции uv_run
есть параметр «режим», который используется со следующими значениями:
UV_RUN_DEFAULT
UV_RUN_ONCE
UV_RUN_NOWAIT
Первые два очевидны. UV_RUN_DEFAULT
запускает цикл событий до тех пор, пока не закончатся события, и UV_RUN_ONCE
обрабатывает одно событие из цикла. Тем не менее, UV_RUN_NOWAIT
не является отдельным режимом, а скорее флагом, который можно объединить с одним из двух других значений.
По умолчанию эта функция блокируется до завершения обработки событий, а UV_RUN_NOWAIT
делает ее неблокирующей, но любая документация, которую я могу найти по ней, на этом заканчивается. Мой вопрос: если вы запускаете неблокирующий цикл событий, как обрабатываются обратные вызовы?
Модель событий libuv является однопоточной (шаблон реактора), поэтому я предполагаю, что она должна быть заблокирована, чтобы иметь возможность вызывать обратные вызовы, но если основной поток занят, что происходит с событием после его обработки? Будет ли обратный вызов «поставлен в очередь» до тех пор, пока libuv снова не получит контроль над основным потоком? Или обратные вызовы будут отправлены в другой поток?