Короткий вопрос по asincio: Корутины выполняются в одном потоке?
Всегда разные треды, всегда один тред или потоки выделяются по необходимости? Зависит ли это от реализации loop?
Этот вопрос связан с использованием threading.local
Ответ
Да.
An event loop runs in a thread and executes all callbacks and tasks in the same thread.
asyncio.get_event_loop() возвращает цикл событий соответствующий текущему контексту. По умолчанию это текущий поток, то есть один цикл на поток. При вызове из coroutine, возвращается цикл, который эту coroutine выполняет
When called from a coroutine or a callback (e.g. scheduled with call_soon
or similar API), this function will always return the running event loop.
Большинство методов и классов в asyncio не являются потокобезопасными. Если хотите из другого потока запустить задачу в цикле, то можно использовать asyncio.run_coroutine_threadsafe()
Даже в одном потоке могут быть проблемы с изменением нелокального состояния при возвращении контроля циклу событий (await). См., PEP 550 -- Execution Context. В Питоне 3.7 доступен contextvars модуль, реализующий PEP 567 -- Context Variables
Комментариев нет:
Отправить комментарий