Каков предпочтительный способ вызова синхронного кода из асинхронных маршрутов в Sanic? - PullRequest
0 голосов
/ 04 декабря 2018

Я исследую 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 ответом.

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

...