Ожидание (уступка) в синхронной функции, чтобы позволить другим асинхронным функциям продолжаться

#python #python-asyncio

#питон #python-asyncio

Вопрос:

Я использую asyncio для нескольких задач. Однако одна из этих задач использует библиотеку, которая не поддерживает asyncio, и ей должна быть предоставлена обычная (не асинхронная) функция обратного вызова. По другим причинам я не могу просто поместить вызов библиотечной функции в исполнителя.

Есть ли в моем обратном вызове какой-либо способ, которым я могу сказать библиотеке asyncio переключиться на другие задачи (необходимо), а затем возобновить обратный вызов? Например, если бы я мог вызвать что-то вроде того, что вы бы вызвали yield() в многопоточной программе или await asyncio.sleep(0) в программе asyncio. Что-то, что могло бы подсказать циклическому устройству asyncio просмотреть свой список задач и вернуться, как только он просмотрит текущий список доступных задач? Я думаю о том, как вручную перекачивать некоторые сообщения из цикла событий.

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

1. Если библиотека блокируется, она не может работать в потоке asyncio, она должна выполняться в отдельном потоке. Обратный вызов, который вы предоставляете, может затем взаимодействовать с asyncio с помощью asyncio.run_coroutine_threadsafe() и аналогично. Из вашего вопроса я понимаю, что вы не можете запустить библиотеку в другом потоке «по другим причинам». Если это так, можете ли вы затронуть эти причины? Возможно, там можно что-то сделать.