通过python asyncio正确使用sqlalchemy作用域的_会话
我正在使用asyncio构建一个应用程序。我将使用sqlalchemy作为orm。 据我所知,scoped_session将会话与线程相关联,这样它们就不会与彼此的操作相关联。 现在,由于asyncio在单个线程上工作,我相信作用域_会话将无法正常工作,这将导致问题。通过python asyncio正确使用sqlalchemy作用域的_会话,python,python-3.x,sqlalchemy,python-asyncio,Python,Python 3.x,Sqlalchemy,Python Asyncio,我正在使用asyncio构建一个应用程序。我将使用sqlalchemy作为orm。 据我所知,scoped_session将会话与线程相关联,这样它们就不会与彼此的操作相关联。 现在,由于asyncio在单个线程上工作,我相信作用域_会话将无法正常工作,这将导致问题。 在异步IO中使用sqlalchemy会话的正确方法是什么?答案取决于您的代码 通常,您可以使用创建会话工厂并自己使用它 如果您的代码具有隐式上下文,则可以将scoped_session与自定义scopefunc一起使用,如中所示
在异步IO中使用sqlalchemy会话的正确方法是什么?答案取决于您的代码 通常,您可以使用创建会话工厂并自己使用它 如果您的代码具有隐式上下文,则可以将
scoped_session
与自定义scopefunc
一起使用,如中所示
隐式上下文可以利用调用,但您还需要找到一种方法来销毁作用域会话。我认为您不能将sqlalchemy与asyncio结合使用。SQL Alchemy API都是阻塞的,并且与asyncio不兼容 不过,只要能为数据库找到与gevent兼容的驱动程序,就可以异步使用SQL Alchemy。gevent greenlents很好地映射到
范围内的会话
编辑:实际上,只要能为数据库找到与asyncio兼容的驱动程序,就可以将SQL Alchemy与asyncio结合使用,例如。对于
作用域会话
,使用当前任务
并在web框架的请求端销毁它。作用域会话销毁的默认行为是什么?当线程关闭时它会被破坏吗?在这种情况下,任务完成后它不会也销毁吗?scoped\u session
没有析构函数,对不起。这就是为什么在上面的示例中需要信号订阅。如果我使用的是aiohttp
框架,我需要在scoped_会话函数的scopefunc
参数中提供什么样的信号订阅@AndrewSvetlovI不想让sqlalchemy异步。我想做的是防止任务在同一时间使用同一会话,即任务不应共享会话。除非您将每个任务项分配给一个新线程,否则使用普通的sqlalchemy会话,即session=sessionmaker(bind=some_engine)session=session()可能就是您所需要的。您可以在任务结束前创建它,并在任务完成后关闭它。