2015-06-02 35 views
8

W wątku mamy coś, co nazywa się "Kontekst wątku", w którym możemy zapisać pewne dane (stan) do uzyskania dostępu w specjalnym wątku. W asyncio, muszę zapisać jakiś stan w bieżącej ścieżce wykonania, aby wszyscy kolejni współprawnicy mieli do niego dostęp. Jakie jest rozwiązanie? Uwaga: Wiem, że każda funkcja coroutine jest tworzona dla ścieżki wykonania w asyncio, ale z jakiegoś powodu nie mogę zapisać stanu we właściwościach funkcji. (Chociaż i ta metoda i tak nie jest zbyt dobra)Python asyncio context

+0

[Ten wątek python-pomysłów] (https: //mail.python .org/pipermail/python-ideas/2015-April/033151.html) i [to zgłoszenie błędu asyncio] (https://github.com/python/asyncio/issues/165) wydają się trafne. – dano

+0

'curio' wydaje się, że to ma https://github.com/dabeaz/curio/pull/85 –

Odpowiedz

7

Możesz spojrzeć na tasklocals library. Wprowadza on tasklocals.local, podobnie jak threading.local dla wielowątkowości.

+0

Dzięki kumplowi! Sprawdziłem kod źródłowy i znalazłem brakującą magię: Task.current_task() – Kamyar

+0

Czy ten kod jest zgodny z ostatnimi wersjami Pythona, ponieważ ta biblioteka nie była aktualizowana od lat? –

+0

tak, jest zgodny –

0

Istnieje również https://github.com/azazel75/metapensiero.asyncio.tasklocal, ale musisz mieć świadomość, że zadania są często tworzone wewnętrznie przez biblioteki, a także przez asyncio przy użyciu ensure_future(a_coroutine) i nie ma rzeczywistego sposobu śledzenia tych nowych zadań i inicjowania ich lokalnych (być może z tymi z zadania, które oni wykonują są tworzone z). ("hak" może ustawić funkcję loop.set_task_factory() z czymś, co wykonuje zadanie, mając nadzieję, że cały kod używa loop.create_task() do tworzenia zadań, co nie zawsze jest prawdą ...)

Kolejną kwestią jest to, że jeśli niektóre z twoich kod jest wykonywany wewnątrz funkcji oddzwaniania Przyszłości Task.current_task(), która jest używana przez obie biblioteki do wyboru właściwej kopii locale do wyświetlenia, zawsze zwróci None ...