混合龙卷风和sqlalchemy

Mig*_*uel 7 python sqlalchemy

我正在尝试编写一个龙卷风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仍然阻塞,但计算重量部分没有阻止应用程序.

Ana*_*nth 4

龙卷风网络服务器使用异步代码来绕过 python 全局解释器锁的限制。GIL(俗称 GIL)只允许在 Python 解释器进程中执行一个线程。由于使用了事件循环,Tornado 能够同时响应多个请求。事件循环一次可以执行一项小任务。让我们用您自己的帖子处理程序来更好地理解这一点。

在此处理程序中,当Python解释器到达await关键字时,它会暂停函数的执行并将其排队以供稍后的事件循环使用。然后,它检查事件循环以响应可能已排队的其他事件,例如响应新连接或为另一个处理程序提供服务。

当您阻塞异步函数时,您会冻结整个事件循环,因为它无法暂停您的函数并为其他任何事情提供服务。这对您来说实际上意味着,当您的异步函数阻塞时,您的 Web 服务器将不会接受或服务任何请求。看起来好像您的网络服务器挂起并且确实卡住了。

为了保持服务器响应,您必须找到一种方法以异步非阻塞方式执行 sqlalchemy 查询。