2016-10-03 29 views
6

Mam 3 sterowniki (przeglądarki Firefox) i chcę je na do something na liście stron internetowych.Multiprocessing and Selenium Python

Mam pracownik zdefiniowany jako:

def worker(browser, queue): 
    while True: 
     id_ = queue.get(True) 
     obj = ReviewID(id_) 
     obj.search(browser) 
     if obj.exists(browser): 
      print(obj.get_url(browser)) 
     else: 
      print("Nothing") 

Zatem pracownik będzie tylko acces do kolejki, która zawiera identyfikatory i wykorzystać przeglądarkę, aby coś zrobić.

Chcę mieć pulę pracowników tak, aby jak tylko pracownik zakończył korzystanie z przeglądarki, aby zrobić coś na stronie zdefiniowanej przez id_, to natychmiast zaczyna działać przy użyciu tej samej przeglądarki, aby zrobić coś w następnym id_ znaleziono w kolejce. Mam wtedy:

pool = Pool(processes=3) # I want to have 3 drivers 
manager = Manager() 
queue = manager.Queue() 
# Define here my workers in the pool 
for id_ in ids: 
    queue.put(id_) 
for i in range(3): 
    queue.put(None) 

Tutaj mam problem, nie wiem jak zdefiniować moich pracowników, aby byli w basenie. Do każdego sterownika muszę przypisać pracownika, a wszyscy pracownicy dzielą tę samą kolejkę identyfikatorów. czy to możliwe? Jak mogę to zrobić?

Inną ideą, którą mam, jest utworzenie kolejki przeglądarek, tak aby w przypadku, gdy sterownik nic nie robi, jest on pobierany przez pracownika wraz z id_ z kolejki w celu wykonania nowego procesu. Ale jestem zupełnie nowy w dziedzinie przetwarzania wieloprocesowego i nie wiem, jak to napisać.

Doceniam twoją pomoc.

+1

Dlaczego nie instancję przeglądarkę w pracownika, zanim rozpocznie się 'while' pętla? –

+0

@LeviNoecker Zrobię to! –

+0

@LeviNoecker można wysłać odpowiedź, aby zaakceptować, jest jako odpowiedź? –

Odpowiedz

4

Można spróbować instancji przeglądarkę na pracownika:

def worker(queue): 
    browser = webdriver.Chrome() 
    try: 
     while True: 
      id_ = queue.get(True) 
      obj = ReviewID(id_) 
      obj.search(browser) 
      if obj.exists(browser): 
       print(obj.get_url(browser)) 
      else: 
       print("Nothing") 
    finally: 
     brower.quit()