Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过python asyncio正确使用sqlalchemy作用域的_会话_Python_Python 3.x_Sqlalchemy_Python Asyncio - Fatal编程技术网

通过python asyncio正确使用sqlalchemy作用域的_会话

通过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一起使用,如中所示

我正在使用asyncio构建一个应用程序。我将使用sqlalchemy作为orm。 据我所知,scoped_session将会话与线程相关联,这样它们就不会与彼此的操作相关联。 现在,由于asyncio在单个线程上工作,我相信作用域_会话将无法正常工作,这将导致问题。
在异步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()可能就是您所需要的。您可以在任务结束前创建它,并在任务完成后关闭它。