2016-03-21 3 views
2

python2.7 в windows | Я добавляю соединение mysql в класс и использую многопроцессорность, повышаю ошибку.python multiprocessing Невозможно pickle <type 'function'>

self.ispop и self.match_var возвращать одно и то Dict

sprawn_self_calcu() и unwrap_self_f() является прокси для функции Map_class

функция Map_class нужна самостоятельная вар.

мой код так:

from analysis_conf.pop_config import pop_config 
import datetime 
import multiprocessing 
from functools import partial 
from sqlalchemy import create_engine 
from multiprocessing import Pool as threadpool 

def sprawn_self_calcu(arg, **kwarg): 
     return Map.mapCin(*arg, **kwarg) 

def unwrap_self_f(arg, **kwarg): 
     return Map.mappalg(*arg, **kwarg) 
partial_unwrap = partial(unwrap_self_f) 
partial_sprawn = partial(sprawn_self_calcu) 

class Map: 
    def __init__(self): 
     self.ispop = pop_config() 
     self.match_var = self.ispop.pop_match_var() 
    def CreateSqlalchemyEngine(self,config): 
     sigma = 'mysql+mysqldb://%s:%[email protected]%s:%s/%s?charset=utf8'%(config['user'],config['passwd'], 
                 config['ipaddr'],config['port'],config['dbname'] 
                 ) 
     return create_engine(sigma,pool_recycle=10,pool_timeout=10800) 

    def Mapping(self,conSet): 
     self.baseCon = conSet 
     self.mappalg() 

     Time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 
    def IUCMapping(self,i,con): 
     print i 
     print self.conf 
     l = con.execute('show tables;') 

    def mappalg(self): 
     mt_val = [1,2,3,4,5] 
     pool = threadpool(4) 
     result = pool.map(partial_sprawn,zip([self]*5,mt_val)) 
    # result = pool.map(partial_sprawn,zip([self]*mtlen,mt_val)) 
     pool.close() 
     pool.join() 
     return True 

    def mapCin(self,i): 
     pid_val = multiprocessing.current_process().pid%4 
     con = self.baseCon[pid_val] 
     print i 
     self.IUCMapping(i,con) 
     return True 

class Create_MultiCon: 
    def __init__(self): 
     self.adapter = pop_config() 
     self.conf = self.adapter.pop_baseDB() 
     self.match_var = self.adapter.pop_match_var() 
    def CreateSqlalchemyEngine(self,config): 
     sigma = 'mysql+mysqldb://%s:%[email protected]%s:%s/%s?charset=utf8'%(config['user'],config['passwd'], 
                 config['ipaddr'],config['port'],config['dbname'] 
                 ) 
     return create_engine(sigma,pool_recycle=10,pool_timeout=10800) 
def RdictXcon(self,x): 
     t = {} 
     engine = self.CreateSqlalchemyEngine(self.conf) 
     for i in xrange(x): 
      t[i] = engine.connect() 
     return t 

if __name__ == '__main__': 
    l = Create_MultiCon() 
    conSet = l.RdictXcon(4) 
    ScMap = Map() 
    ScMap.Mapping(conSet) 

Ошибка:

result = pool.map(partial_sprawn,zip([self]*5,mt_val)) 
    File "C:\Python27\lib\multiprocessing\pool.py", line 251, in map 
    return self.map_async(func, iterable, chunksize).get() 
    File "C:\Python27\lib\multiprocessing\pool.py", line 567, in get 
    raise self._value 
cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 

как SOLV ошибка

ответ

3

multiprocessing модуль Python не может иметь дело с функциями/методов, которые не могут быть солеными, что означает, что вы не можете использовать методы класса или экземпляра без особых хлопот. Я бы рекомендовал использовать multiprocess, который использует dill для сериализации вместо pickle и может иметь дело с методами класса или экземпляра.

Насколько я знаю, интерфейс точно такой же, как тот, который используется в multiprocessing, поэтому вы можете использовать его как замену.

Смотрите также https://stackoverflow.com/a/21345423/1170207

+0

я могу»использовать укроп или пафоса в окнах –

+0

ли [это] (http://stackoverflow.com/questions/33293036/pathos-package-in-windows-operating-system) помощь ? –

+0

Я автор 'dill',' pathos', 'multiprocess' и т. Д. Пакеты тестируются в Windows и должны работать в Windows. Если они не сработают для вас, отправьте билет на соответствующую страницу github и подробно расскажите, что вы видите. –

Смежные вопросы