Является ли asyncio Python `loop.create_task(…)` потокобезопасным?

#python #multithreading #python-asyncio

Вопрос:

У меня есть matplotlib, работающий в основном потоке с живым графиком данных, поступающих из внешнего источника. Для обработки входящих данных у меня есть простой прослушиватель UDP, прослушивающий пакеты с помощью asyncio, с циклом событий, запущенным в отдельном потоке.

Теперь я хочу добавить больше источников, и я хотел бы запустить их слушателей в том же цикле/потоке, что и первый. Для этого я просто передаю объект цикла классам, реализующим прослушиватели, и их конструктор добавляет в цикл задачу, которая инициализирует и запускает прослушиватель.

Однако, поскольку эти классы инициализируются в основном потоке, я вызываю loop.create_task(...) функцию оттуда, а не из потока цикла. Вызовет ли это какие-либо проблемы?

Комментарии:

1. Ответ-нет. Я немного подробнее расскажу.

Ответ №1:

Ответ-нет, использование loop.create_task(...) для планирования сопрограммы из другого потока не является потокобезопасным, вместо этого используйте asyncio.run_coroutine_threadsafe (…).