我正在尝试编写一个龙卷风Web应用程序,它在一些请求处理程序中使用sqlalchemy.这些处理程序有两个部分:一个需要很长时间才能完成,另一个使用sqlalchemy并且相对较快.我想使请求的缓慢部分异步,但不是sqlalchemy部分.我可以做类似下面的代码并且安全吗?
class ExampleHandler(BaseHandler):
async def post(self):
loop = asyncio.get_event_loop()
await loop.run_in_executor(...) # very slow (no sqlalchemy here)
with self.db_session() as s: # sqlalchemy session
s.add(...)
s.commit()
self.render(...)
Run Code Online (Sandbox Code Playgroud)
想法是让sqlalchemy仍然阻塞,但计算重量部分没有阻止应用程序.
龙卷风网络服务器使用异步代码来绕过 python 全局解释器锁的限制。GIL(俗称 GIL)只允许在 Python 解释器进程中执行一个线程。由于使用了事件循环,Tornado 能够同时响应多个请求。事件循环一次可以执行一项小任务。让我们用您自己的帖子处理程序来更好地理解这一点。
在此处理程序中,当Python解释器到达await关键字时,它会暂停函数的执行并将其排队以供稍后的事件循环使用。然后,它检查事件循环以响应可能已排队的其他事件,例如响应新连接或为另一个处理程序提供服务。
当您阻塞异步函数时,您会冻结整个事件循环,因为它无法暂停您的函数并为其他任何事情提供服务。这对您来说实际上意味着,当您的异步函数阻塞时,您的 Web 服务器将不会接受或服务任何请求。看起来好像您的网络服务器挂起并且确实卡住了。
为了保持服务器响应,您必须找到一种方法以异步非阻塞方式执行 sqlalchemy 查询。
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |