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