gpt4 book ai didi

python - 无法使用 Pool.map() pickle 实例方法,但我没有实例方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:49 25 4
gpt4 key购买 nike

我正在尝试使用 multiprocessing.Pool 对象并行运行一些数据库查询。我正在使用 MySQLdb。

我有一些模块级函数,我在其中定义要运行的查询,如下所示:

def check_foo(cursor, table):
query = "(some query)"
cursor.execute(query)
results = cursor.fetchall()
return len(results) == 0

这些函数是在程序运行时收集的,如下所示:

if __name__ == '__main__':
check_functions = [v for k, v in globals().items()
if k.startswith('check_') and callable(v)]

我还有一个模块级函数,可以在表列表上运行特定的检查函数:

def run_check_on_all((tables, cursor, f)):
return [f(cursor, table) for table in tables]

我希望每个检查函数都有一个工作进程,该进程将为该函数调用 run_check_on_all。这是我的尝试:

if __name__ == '__main__':
...

pool = multiprocessing.Pool(len(check_functions))
cursors = [conn.cursor() for i in range(len(check_functions))]

print "Running {0} check(s)...".format(len(check_functions))
table_lists = [table_list] * len(check_functions)
all_results = pool.map(run_check_on_all, zip(table_lists, cursors, check_functions))

当我尝试运行此程序时,出现以下错误:

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/local/Python2.6/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/usr/local/Python2.6/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/local/Python2.6/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

正如您所看到的(希望如此),对 pool.map 的调用中不涉及任何实例方法。 run_check_on_all 和每个 check_functions 都是模块级函数。 table_lists 是字符串列表的列表。 cursors 是 MySQLdb 游标对象的列表。

我认为这可能与在检查函数中调用光标对象的实例方法有关,但我用这样的虚拟函数替换了它们

def check_foo(cursor, table):
print "hello"

但仍然没有运气。

错误引用的实例方法在哪里?

最佳答案

问题在于您尝试在进程之间传递数据库游标对象。每个进程必须创建到数据库的连接,并在该连接上创建游标。

关于python - 无法使用 Pool.map() pickle 实例方法,但我没有实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17093258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com