python multiprocessing.Pool - UnpickleableError: Cannot pickle 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://stackoverflow.com/questions/7865430/multiprocessing-pool-picklingerror-cant-pickle-type-thread-lock-attribu

 

原文:http://www.cnblogs.com/congbo/archive/2012/08/22/2650530.html

你可能感兴趣的:(process)