Python 如何将SQLAlchemy会话传递给多处理函数?
我使用SQLAlchemy查询SQLite数据库并获取列表中每个元素的一些信息。 我的辅助函数接受一个元素和一个会话对象来完成它的工作 但是当列表很长并且我的CPU负载很低(10%)时,它就太慢了 因此,我认为使用多处理器来充分利用我的CPU并提高一点速度是个好主意。 我使用包来实现这一点,它基于Python 如何将SQLAlchemy会话传递给多处理函数?,python,sqlite,sqlalchemy,multiprocessing,Python,Sqlite,Sqlalchemy,Multiprocessing,我使用SQLAlchemy查询SQLite数据库并获取列表中每个元素的一些信息。 我的辅助函数接受一个元素和一个会话对象来完成它的工作 但是当列表很长并且我的CPU负载很低(10%)时,它就太慢了 因此,我认为使用多处理器来充分利用我的CPU并提高一点速度是个好主意。 我使用包来实现这一点,它基于pathos.multiprocessing.ThreadPool和tqdm 我的代码类似于result=p\u map(作业、我的列表、会话),我遇到了一个PicklingError: _pickle
pathos.multiprocessing.ThreadPool
和tqdm
我的代码类似于result=p\u map(作业、我的列表、会话)
,我遇到了一个PicklingError
:
_pickle.PicklingError: Can't pickle <class 'sqlalchemy.orm.session.Session'>: it's not the same object as sqlalchemy.orm.session.Session
这是否意味着在使用多重处理时无法传递会话对象?我所有的数据库操作都是使用SELECT
进行查询的,我如何才能做到这一点
谢谢 您是否对列表中的每个项目进行查询?您是否考虑过使用单个查询获取所有相关项的可能性?对于“如何在进程之间共享
会话”
,通常的回答是“您不能”,因为在大多数情况下,会话所保持的连接不应共享。每个进程都应该创建自己的连接池,即引擎
,以及自己的会话。@IljaEverilä是的,你说得对。我对每个项目发出一个查询。我使用ORM查询对象及其相关对象(例如,个人和他的朋友),是否可以使用ORM在一个命令中获取所有人的朋友?或者我必须使用原始SQL来实现这一点?SQLAlchemy提供了大量急切的加载方法。这听起来像是一对多或多对多,对于这一点,select in style eager loading是一个不错的选择。例如,见。因此,您可以从列表中收集用户ID,在谓词中使用来获取所有用户,并立即加载以获取他们的相关朋友。@IljaEverilä谢谢!select in方法对我来说相当复杂,我还尝试在每个作业
函数中创建一个引擎和会话,但我收到了以下错误消息:NameError:name'create_engine'未定义
。我很困惑。@IljaEveriläI设法使用了急切加载方法,它将时间减少了20%左右,我可以对它进行多重处理吗?
with Pool(2) as p:
result = p.starmap(job, zip(my_list, repeat(session)))