我正在使用asyncio构建应用。我将使用sqlalchemy作为orm。 根据我的理解,scoped_session将一个会话与一个线程相关联,这样他们就不会相互操作。 既然asyncio在单个线程上工作,我相信scoped_session将无法正常工作,这将导致问题。 将sqlalchemy会话与asyncio一起使用的正确方法是什么?
答案 0 :(得分:2)
答案取决于您的代码。
通常,您可以使用sessionmaker创建会话工厂并自行使用它。
如果您的代码具有隐式上下文,则可以scoped_session
使用自定义scopefunc
,如example所示。
隐式上下文可能会使用asyncio.Task.current_task()调用,但您还需要找到一种范围内的会话销毁方法。
答案 1 :(得分:1)
我认为你不能将sqlalchemy用于asyncio。 SQL Alchemy API全部阻止并与asyncio不兼容。 http://techspot.zzzeek.org/2015/02/15/asynchronous-python-and-databases/
可以与gevent异步使用SQL Alchemy,只要您可以为数据库找到与gevent兼容的驱动程序。而gevent greenlents很好地映射到scoped_session
。
编辑:实际上,只要你能为数据库找到asyncio兼容的驱动程序,例如https://github.com/aio-libs/aiopg,看起来可以将SQL Alchemy与asyncio一起使用。至于scoped_session
,请使用current_task
并在您的网络框架的请求端销毁它。