Я оказался в сложной ситуации, в которой я не могу найти свой выход из: < /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
Позвоните асинхронному коду внутри кода синхронизации внутри асинхрового кода ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Позвоните асинхронному коду внутри кода синхронизации внутри асинхрового кода
Anonymous » » в форуме Python - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как обернуть задачу в задачу
без использования асинхрового состояния машины? [закрыто]
Anonymous » » в форуме C# - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как обернуть задачу в задачу
без использования асинхрового состояния машины?
Anonymous » » в форуме C# - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Позвоните в другой блокнот Jupyter, передача переменных и получение переменных
Anonymous » » в форуме Python - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-