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

Python 3.x Sanic中从异步路由调用同步代码的首选方法是什么?,python-3.x,sanic,Python 3.x,Sanic,我正在研究Sanic,因为我们正在寻找基于烧瓶的rest服务的替代方案。我对sanic的异步特性很感兴趣,但我知道我们会遇到很多根本不支持异步的代码(例如,我们在DynamoDB上使用了大量的boto3和一些ORM,这些都不支持) 所以:我需要找到一种最干净的方式,能够在Sanic这样的异步框架内运行同步代码。在Python3.7中,有一个asyncio.create_任务调用,我觉得很有趣 想知道这是否是一种可行的方式: main.py: #default boilerplate sanic

我正在研究Sanic,因为我们正在寻找基于烧瓶的rest服务的替代方案。我对sanic的异步特性很感兴趣,但我知道我们会遇到很多根本不支持异步的代码(例如,我们在DynamoDB上使用了大量的boto3和一些ORM,这些都不支持)

所以:我需要找到一种最干净的方式,能够在Sanic这样的异步框架内运行同步代码。在Python3.7中,有一个asyncio.create_任务调用,我觉得很有趣

想知道这是否是一种可行的方式:

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)
这似乎有效,返回的任务对象是一个常规的
请求
响应


但是,我不知道这是否“安全”——例如,我不确定如何调查事件循环并验证它是否以任何方式阻塞。我确信这种方法完全愚蠢还有其他原因,所以请告诉我:-)

什么是“非异步协同路由”?尝试澄清如果您仍在寻找答案,那么使用
请求
将阻止事件循环,因为
请求
库不是异步的。您需要使用异步http库,如。可以在中看到一个示例。谢谢@xyres。我的问题是:当我没有可用的异步选项时,我能做什么?(请求只是用作非异步库的一个示例)@Trondh哦,在这种情况下,如果您正在执行与网络相关的任务,您可以自己编写异步版本。如果这是一个CPU繁重的任务,那么唯一的选择就是在单独的线程或进程中运行它。