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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM