Позвоните асинхронному коду внутри кода синхронизации внутри асинхрового кодаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Позвоните асинхронному коду внутри кода синхронизации внутри асинхрового кода

Сообщение Anonymous »

Я оказался в сложной ситуации, в которой я не могу найти свой выход из: < /p>

Я написал приложение, в котором используется асинсио (и, в частности, Aiohttp). < /li>
В части этого приложения мне не нужно использовать третий организм (в моем случае, Weasyprint), который нет , который не должен использовать библиотеку третьего часа (в моем случае, который не должен использовать библиотеку третьего часа (в моем случае. Асинхронизация. Этот обратный вызов, очевидно, должен быть синхронизированным, но я хочу использовать свой существующий асинхровый код как часть этого обратного вызова. (У меня уже есть клиентский сеанс AIOHTTP, который я хочу использовать, и я внедрил некоторые клиенты в этом сеансе, которые делают некоторые полезные вещи. Я не хочу писать вторую полностью синхронизированную версию этого кода.) Async URL -код избранного кода во втором цикле с LOOP.RUN_UNTIL_COMPLETE . Затем я использовал queue.queue , чтобы заблокировать выполнение в основном потоке, пока вторичный поток со вторым циклом события не вернет результат. К сожалению, это бросало ошибки из -за попыток выполнить задачи в неверном цикле событий. Кажется, я не могу использовать сеанс клиента вне цикла событий, где он был создан. К сожалению, это не удалось, потому что «этот цикл событий уже работает». Кажется, что это не имело значения, что это только ожидало в ветке Weasyprint, он все равно не позволил бы мне запустить еще одну цинку в цикле. Чтобы найти способ force , чтобы использовать асинхронный обратный вызов, хотя этот обратный вызов в действительности просто работает синхронно.
У меня действительно есть только понимание асинсио; Я не знаю много подробностей более низкого уровня о том, как работают петли событий и все это, поэтому я уверен, что приведенные выше подходы немного наивны, но мне кажется, что это должен быть каким-то способом выполнить это.def print_weasyprint(html:IOBase, resources:aiohttp.ClientSession):
out = io.BytesIO()
HTML(
file_obj=html,
url_fetcher=_make_url_fetcher(resources),
).write_pdf(out)
return out

def _call_async_secondary_loop(coro):
q = queue.Queue(1)
def secondary():
loop = asyncio.new_event_loop()
q.put(loop.run_until_complete(coro))
Thread(target=secondary).start()
return q.get()

def _make_url_fetcher(resources:aiohttp.ClientSession):
def fetcher(url, *args, **kwargs):
content = _call_async_secondary_loop(_fetch(resources, url))
return {'string':content}
return fetcher

async def _fetch(resources, url):
async with reources.get(url) as resource:
return await resource.content.read()

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



Подробнее здесь: https://stackoverflow.com/questions/796 ... async-code
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»