2016-07-26 12 views
0

Ich habe eine Funktion, die in einem einzigen Thread funktioniert. Hier ist ein vereinfachtes Beispiel. Grundsätzlich möchte ich ein paar tote Links überprüfen und das Ergebnis in jedem Element in einer Liste von Wörterbüchern speichern.Verwendung von Multiprocessing für eine Funktion schlägt fehl mit - String-Indizes müssen Ganzzahlen sein

import requests 
import sys 
import logging 

def main(): 
    urls_to_check = [{'url': 'http://example.com'}, 
        {'url': 'http://example.com'}, 
        {'url': 'http://example.com'}] 
    print check_for_404(urls_to_check) 

def check_for_404(urls_to_check): 
    for item in urls_to_check: 
     r = requests.get(item['url']) 
     item.update({'responseCode': r.status_code}) 
    return urls_to_check 

if __name__ == '__main__': 
    try: 
     main() 
    except: 
     logging.error("Unexpected error:" + str(sys.exc_info())) 

Ausgänge:

[{'url': 'http://example.com', 'responseCode': 200}, {'url': 'http://example.com', 'responseCode': 200}, {'url': 'http://example.com', 'responseCode': 200}] 

Und ich bin glücklich mit diesem

Nun, wenn ich Multiprozessing implementieren, die ich verstehe, ist eine iterable über mehrere Kerne aufteilen und führen Teile der Iterable durch die Funktion ...

import requests 
import sys 
import logging 
from multiprocessing import Pool 

def main(): 
    urls_to_check = [{'url': 'http://example.com'}, 
        {'url': 'http://example.com'}, 
        {'url': 'http://example.com'}] 
    p = Pool(5) 
    print p.map(check_for_404, urls_to_check) 

def check_for_404(urls_to_check): 
    for item in urls_to_check: 
     r = requests.get(item['url']) 
     item.update({'responseCode': r.status_code}) 
    return urls_to_check 

if __name__ == '__main__': 
    try: 
     main() 
    except: 
     logging.error("Unexpected error:" + str(sys.exc_info())) 

ich den Fehler TypeError('string indices must be integers, not str',), <traceback object at 0x10ad6c128>)

Wie kann ich Multiprozessing implementieren, damit ich eine lange Liste von URLs schneller verarbeiten kann?

Dies ist das Tutorial Ich betrachte: https://docs.python.org/2/library/multiprocessing.html

+1

zeigen Bitte die vollständige Fehlermeldung und vollständige Rückverfolgung. – BrenBarn

+0

Alles fertig. Sorry –

Antwort

2

Sie benötigen ändern Funktion „für 404 Check“ eine einzige URL statt einer Liste zu akzeptieren; die Kartenfunktion übergibt die Listenelemente in einem nach dem anderen (auf separate Teilprozesse im Pool), setzt sie dann wieder in eine Liste am Ende:

def check_for_404(item): 
    r = requests.get(item['url']) 
    item.update({'responseCode': r.status_code}) 
    return item 
+0

Das ist so cool. Danke für die Hilfe. –

+0

Kann die Funktion beim Aufruf durch den Multiprozessor andere Parameter annehmen? z.B. 'def check_for_404 (item, some_other_string_i_may_want_to_use):' –

+0

ich denke, der einfachste Weg wäre, alle Ihre Parameter in das Diktat aufzunehmen, z. '{'url': 'example.com', 'other_string': 'blabla'}', und lassen Sie Ihre Funktion herausziehen – maxymoo

Verwandte Themen