Всем привет.
Суть такая: есть парсер страниц, которые иногда возвращает те ссылки, по которым уже прошлись. Чтобы избежать дублирования я добавил некий tasks_done, в который скидываю те ссылки, по которым уже прошелся. Соответственно, в очередь падает задание, только если его нет в tasks_done. Чтобы избежать всяких косяков в multuprocessing, я, как я понимаю (а может и неправильно понимаю), нужно юзать менеджер. Но он что-то не работает.
__author__ = 'user'
import multiprocessing
from time import sleep
class A:
def __init__(self, num_proc=4):
self.m = multiprocessing.Manager()
self.tasks_done = self.m.list()
self.q = multiprocessing.Queue()
self.num_proc = num_proc
def worker(self):
while True:
task = self.q.get()
print task
self.tasks_done.append(task)
for i in range(task-5, task+5):
if i not in self.tasks_done:
self.q.put(i)
def init_processes(self):
for i in range(self.num_proc):
p = multiprocessing.Process(target=self.worker)
p.daemon = True
p.start()
p.join()
def add_task(self, i):
self.q.put(i)
#if __name__ == '__main__':
a = A()
a.add_task(100)
a.init_processes()
Условие «if i not in self.tasks_done:» в цикле выполняется настолько редко, что почти вся очередь состоит из дубликатов. Без lock.acquire/release это сделать как-нибудь можно? И в чем в таком случае назначение этого менеджера?