Изглежда, че манипулатори от logging
модул и multiprocessing
задания не се смесват:
import functools
import logging
import multiprocessing as mp
logger = logging.getLogger( 'myLogger' )
handler = logging.FileHandler( 'logFile' )
def worker( x, handler ) :
print x ** 2
pWorker = functools.partial( worker, handler=handler )
#
if __name__ == '__main__' :
pool = mp.Pool( processes=1 )
pool.map( pWorker, range(3) )
pool.close()
pool.join()
Излязло:
cPickle.PicklingError: Can't pickle <type 'thread.lock'>: attribute lookup thread.lock failed
Ако заменя pWorker
с някой от следните методи, не се появява грешка
# this works
def pWorker( x ) :
worker( x, handler )
# this works too
pWorker = functools.partial( worker, handler=open( 'logFile' ) )
Наистина не разбирам PicklingError
. Дали защото обектите от клас logging.FileHandler
не могат да се избират? (търсих го в Google, но не намерих нищо)