在Sanic中从异步路由调用同步代码的首选方法是什么?

时间:2018-12-04 18:31:54

标签: python-3.x sanic

我正在寻找Sanic,因为我们正在寻找基于烧瓶的休息服务的替代方案。我对sanic的异步特性很感兴趣,但是我知道我们会碰到很多根本不支持异步的代码(例如,我们在DynamoDB上使用了大量的boto3和一些ORM,没有一个其中的支持正在等待中。)

因此:我需要找到能够在诸如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 个答案:

没有答案