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