相關代碼:
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