python multiprocessing.Pool - UnpickleableError: Cannot pickle <type 'thread.lock'> objects
相关代码:
1 pool = multiprocessing.Pool(processes=pool_size, initializer=start_process) 2 3 #process_cralwer = pool.apply_async(dianshang_current.main, args=(max_threads_num, db, i)) 4 5 process_cralwer = pool.apply_async(dianshang_current.main, args=(max_threads_num, db, seeds))
max_threads_num为进程中的线程个数,db为数据库操作相关的类,i为数字,seeds为db执行select后返回的元组。
修改第3行为第5行,及相关代码之后运行时报错。
错误信息:
Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner self.run() File "/usr/lib/python2.6/threading.py", line 484, in run self.__target(*self.__args, **self.__kwargs) File "/usr/lib/python2.6/multiprocessing/pool.py", line 226, in _handle_tasks put(task) UnpickleableError: Cannot pickle <type 'thread.lock'> objects
开始以为错误是由于传递的最后一个参数由i改为seeds引起,google后发现元组、列表、字符串类型都是pickleable的。
错误是传递的db类型变为thread.lock造成的,而之前的db没有进行数据库操作故没有连接数据库。
于是,在db进行数据库操作后断开数据库连接后再传入Pool就好了。
参考:
原文:http://www.cnblogs.com/congbo/archive/2012/08/22/2650530.html