2016-10-03 2 views
6

Ich habe 3 Treiber (Firefox-Browser) und ich möchte sie in einer Liste von Websites do something.Multiprocessing und Selenium Python

Ich habe einen Arbeiter wie folgt definiert:

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") 

Also der Arbeiter nur in eine Warteschlange acces wird, dass der IDs enthält und den Browser verwenden, etwas zu tun.

Ich möchte einen Pool von Arbeitern haben, so dass sobald ein Arbeiter mit dem Browser fertig ist, etwas auf der von id_ definierten Website zu tun, er sofort mit dem gleichen Browser arbeitet, um etwas auf dem nächsten zu tun ID_ in der Warteschlange gefunden. Ich habe dann das:

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) 

Hier Ich habe ein Problem, ich weiß nicht, wie meine Mitarbeiter so definieren, dass sie im Pool sind. Jedem Fahrer muss ich einen Arbeiter zuweisen, und alle Arbeiter teilen sich die gleiche Warteschlange von IDs. Ist das möglich? Wie kann ich es tun? Eine andere Idee, die ich habe, ist eine Warteschlange von Browsern zu erstellen, so dass, wenn ein Treiber nichts tut, er von einem Arbeiter zusammen mit einer ID aus der Warteschlange genommen wird, um einen neuen Prozess durchzuführen. Aber ich bin völlig neu im Multiprocessing und weiß eigentlich nicht, wie ich das schreiben soll.

Ich schätze Ihre Hilfe.

+1

Warum den Browser in dem Arbeiter nicht instanziiert, bevor die 'while' Schleife beginnt? –

+0

@LeviNoecker Ich werde es tun! –

+0

@LeviNoecker kannst du eine Antwort posten, um als Antwort zu akzeptieren? –

Antwort

4

Sie könnten versuchen, den Browser in dem Arbeiter Instanziierung:

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()