我正在寻找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
响应。
但是,我不知道这是否“安全”-例如,我不确定如何调查事件循环并确认它没有以任何方式阻塞。我确定这种方法完全愚蠢还有其他原因,所以请把它们放在我身上:-)