Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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 如何将SQLAlchemy会话传递给多处理函数?_Python_Sqlite_Sqlalchemy_Multiprocessing - Fatal编程技术网

Python 如何将SQLAlchemy会话传递给多处理函数?

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

我使用SQLAlchemy查询SQLite数据库并获取列表中每个元素的一些信息。 我的辅助函数接受一个元素和一个会话对象来完成它的工作

但是当列表很长并且我的CPU负载很低(10%)时,它就太慢了

因此,我认为使用多处理器来充分利用我的CPU并提高一点速度是个好主意。 我使用包来实现这一点,它基于
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)))