#python_3x #asyncio
Короткий вопрос по asincio: Корутины выполняются в одном потоке? Всегда разные треды, всегда один тред или потоки выделяются по необходимости? Зависит ли это от реализации loop? Этот вопрос связан с использованием threading.local.
Ответы
Ответ 1
Да.: 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.
Комментариев нет:
Отправить комментарий