2016-12-10 5 views
0

У меня есть класс со следующим методом:Python многопроцессорной обработки, не солить thread.lock (PyMongo)

def get_add_new_links(self, max_num_links): 
    self.get_links_m2(max_num_links) 
    processes = mp.cpu_count() 
    pool = mp.Pool(processes=processes) 
    func = partial(worker, self) 
    with open(os.path.join(self.report_path, "links.txt"), "r") as f: 
     reports = pool.map(func, f.readlines()) 
    pool.close() 
    pool.join() 

где get_links_m2 еще один метод, который создает файл «links.txt». Работник:

def worker(obje, link): 
    doc, rep = obje.get_info_m2(link) 
    obje.add_new_active(doc, sure_not_exists=True) 
    return rep 

метод get_info_m2 посещает ссылку и извлекает информацию. Метод add_new_active добавляет информацию в MongoDB.

Что может быть неправильным с моим кодом? когда я запускаю его я получаю эту ошибку (и отслеживающий):

Файл "controller.py", строка 234, в get_add_new_links

reports = pool.map(func, f.readlines()) File "/home/vladimir/anaconda3/lib/python3.5/multiprocessing/pool.py", line 

260, на карте

return self._map_async(func, iterable, mapstar, chunksize).get() File "/home/vladimir/anaconda3/lib/python3.5/multiprocessing/pool.py", 

линии 608, в

получить
raise self._value File "/home/vladimir/anaconda3/lib/python3.5/multiprocessing/pool.py", line 

385, в _handle_tasks

put(task) File "/home/vladimir/anaconda3/lib/python3.5/multiprocessing/connection.py", 

линия 206, в посыла

self._send_bytes(ForkingPickler.dumps(obj)) File "/home/vladimir/anaconda3/lib/python3.5/multiprocessing/reduction.py", 

линия 50, в отвалах

cls(buf, protocol).dump(obj) TypeError: can't pickle _thread.lock objects 

ответ

1

Как указано в the docs:

Никогда не делайте этого:

client = pymongo.MongoClient() 

# Each child process attempts to copy a global MongoClient 
# created in the parent process. Never do this. 
def func(): 
    db = client.mydb 
    # Do something with db. 

proc = multiprocessing.Process(target=func) 
proc.start() 

Вместо этого внутри рабочей функции клиент должен быть инициализирован.