Podczas działania pętli zdarzeń w libuv użyciu funkcji uv_run
, jest parametr „Tryb”, który stosuje się z następującymi wartościami:W jaki sposób tryb UV_RUN_NOWAIT działa w libuv?
UV_RUN_DEFAULT
UV_RUN_ONCE
UV_RUN_NOWAIT
Pierwsze dwa są widoczne. UV_RUN_DEFAULT
uruchamia pętlę zdarzeń, dopóki nie będzie już żadnych zdarzeń, i UV_RUN_ONCE
przetwarzanie pojedynczego zdarzenia z pętli. Jednakże, UV_RUN_NOWAIT
nie wydaje się być oddzielnym trybem, ale raczej flagą, która może być OR z jedną z dwóch pozostałych wartości.
Domyślnie ta funkcja blokuje do momentu zakończenia przetwarzania zdarzeń, a UV_RUN_NOWAIT
uniemożliwia odblokowanie, ale na tym kończy się każda dokumentacja, którą można znaleźć. Moje pytanie brzmi: jeśli uruchomisz pętlę zdarzeń bez blokowania, w jaki sposób obsługiwane są wywołania zwrotne?
Model zdarzeń libuv jest jednowątkowy (wzorzec reaktora), więc zakładam, że musi on blokować, aby móc wywoływać wywołania zwrotne, ale jeśli główny wątek jest zajęty, co dzieje się ze zdarzeniem po jego przetworzeniu ? Czy wywołanie zwrotne będzie "ustawione w kolejce", dopóki libuv ponownie nie zapanuje nad głównym wątkiem? Czy wywołania zwrotne będą wysyłane w innym wątku?
Ta dokumentacja (ta w uv.h) jest stara, a czasami nieścisła. Nowa dokumentacja znajduje się na docs.libuv.org: http://docs.libuv.org/en/v1.x/loop.html#c.uv_run – saghul