2014-12-17 28 views
6

Próbuję asyncio i muszę go wymieszać z normalnym wielowątkowym kodem blokującym, więc potrzebuję odciążyć wykonanie przy pomocy run_in_exector.Czy loop.run_in_executor asyncio jest bezpieczny dla wątków?

The asyncio docs warn that "most functions" aren't threadsafe, i że call_soon_threadsafe jest jedyną funkcją bezpieczną dla wątków. Istnieje kilka innych, takich jak Future.add_done_callback, które są jawnie udokumentowane jako bezpieczne dla wątków. Następnie ma zdanie, które mówi "możesz użyć run_in_executor do uruchamiania wywołań zwrotnych w innych wątkach", ale nie komentuje w szczególności wątku bezpieczeństwa.

run_in_executor nie jest bezpieczny dla wątków, ale patrząc na źródło, wygląda na to, że jest bezpieczny dla wątków, jeśli zostaną zrobione właściwe ścieżki kodu.

Czy ktoś wie, czy jest to z założeniem, że jest bezpieczny dla wątków, ale czy nie jest tak udokumentowany?

+0

Co masz na myśli przez "wątek bezpieczny" w tym kontekście? Dokument używa tego terminu do wskazania, czy można bezpiecznie wywołać daną metodę z wątku poza tym, który uruchamia pętlę zdarzeń 'asyncio'. Prawdopodobnie nie o to tu pytasz, prawda? – dano

+0

To właśnie miałem na myśli. Mam istniejący kod wielowątkowy i próbuję użyć asyncio z nim, więc potrzebuję wątku bezpiecznego sposobu zaplanowania kodu blokującego. –

Odpowiedz

4

run_in_executor ma być nie wątkowo przez specyfikacji (Niestety, wygląda na to niejawny oświadczenia i prawdopodobnie powinny być wyjaśnione w PEP-3156).

Nawet jeśli konkretne wdrożenie jest bezpieczne dla wątków, nie należy zakładać, że jakakolwiek implementacja zgodna z PEP-3156 będzie również bezpieczna dla wątków.

+2

Poprawnym sposobem, aby uczynić go (lub cokolwiek) bezpiecznym wątkiem wątku jest zawinięcie go w call_soon_threadsafe: 'loop.call_soon_threadsafe (loop.run_in_executor, executor, callback, * args))' – Lucretiel

2

Myślę, że to całkowicie zależy od tego, co dajesz. Skutecznie uruchamia wątek i uruchamia twój kod, więc to czy jest bezpieczne dla wątków, zależy od tego, co powiesz.

2

Domyślna implementacja wydaje się być bezpieczny wątku, jeśli parametr wykonawca nie jest brak lub domyślne wykonawca jest już ustawiony (wezwanie loop.set_default_executor()). W przeciwnym razie można utworzyć dwa executory.

Możesz napisać łatkę, która sprawi, że metoda będzie bezpieczna dla wątków ;-)

Powiązane problemy