Каков предпочтительный способ вызова синхронного кода из асинхронных маршрутов в Sanic?

Я исследую Sanic, поскольку мы ищем альтернативы нашим услугам отдыха на колбах. Я заинтригован асинхронной природой sanic, но я знаю, что мы столкнемся с большим количеством кода, который просто не будет поддерживать асинхронность (мы используем тонну boto3, а также некоторые ORM, например, поверх DynamoDB, ни один из которых поддержка ожидает).

Итак: мне нужно найти самый простой способ запуска синхронного кода внутри асинхронной среды, такой как Sanic. В python 3.7 есть вызов asyncio.create_task, который мне кажется интересным.

Хотите знать, если это будет возможным путем:

main.py:

#default boilerplate sanic code excluded for brevity
from app_logic import AppLogic

@app.route("/")
async def test(request):
    task = await asyncio.create_task(AppLogic.sync_request('https://stuff.com'))
    return json({"hello": "world", 'status_code': task.status_code})

app_logic.py:

import requests

class AppLogic(object):
    @staticmethod
    async def sync_request(url='https://myurl.com'):
        #Some non-async library/code thingy
        print('requesting the thing')
        return requests.get(url)

Кажется, это работает, и возвращаемый объект задачи является обычным requests ответ.

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

0 ответов

Другие вопросы по тегам