2016-06-15 5 views
0

Ich habe eine Datei mit 100.000 URLs, die ich anfragen und dann verarbeiten muss. Die Verarbeitung benötigt eine nicht zu vernachlässigende Zeit im Vergleich zu der Anfrage, so dass die Verwendung von Multithreading nur eine teilweise Beschleunigung bringt. Von dem, was ich gelesen habe, denke ich, dass die Verwendung des Moduls multiprocessing oder etwas Ähnliches eine substantielle Beschleunigung bieten würde, da ich mehrere Kerne verwenden könnte. Ich vermute, ich möchte einige Prozesse mit mehreren Threads verwenden, aber ich bin mir nicht sicher, wie das geht.Schnellste Möglichkeit zum Lesen und Verarbeiten von 100.000 URLs in Python

Hier ist mein aktueller Code, Gewindeschneiden mit (basierend auf What is the fastest way to send 100,000 HTTP requests in Python?):

from threading import Thread 
from Queue import Queue 
import requests 
from bs4 import BeautifulSoup 
import sys 

concurrent = 100 

def worker(): 
    while True: 
     url = q.get() 
     html = get_html(url) 
     process_html(html) 
     q.task_done() 

def get_html(url): 
    try: 
     html = requests.get(url, timeout=5, headers={'Connection':'close'}).text 
     return html 
    except: 
     print "error", url 
     return None 

def process_html(html): 
    if html == None: 
     return 
    soup = BeautifulSoup(html) 
    text = soup.get_text() 
    # do some more processing 
    # write the text to a file 

q = Queue(concurrent * 2) 
for i in range(concurrent): 
    t = Thread(target=worker) 
    t.daemon = True 
    t.start() 
try: 
    for url in open('text.txt'): 
     q.put(url.strip()) 
    q.join() 
except KeyboardInterrupt: 
    sys.exit(1) 
+1

. @ Gus Sie werden nicht beschleunigen mit der gleichzeitigen Verwendung von 100. Sie alle gehen zur gleichen Zeit, und Überraschung - sie alle kommen wieder warten auf OS-Prozesse. Was Sie tun könnten, ist zwei Schritte. Ziehen Sie alles mit lokalem Threading (i/o) und multi-process mit Kernen * 2. (oder, Sie werden das gleiche Problem haben) – Merlin

+0

Ich sehe. Vielleicht könnte ich es in zwei Skripte aufteilen - ein Skript, das nur Multithreading verwendet, und das rohe HTML in Dateien speichern. Dann haben Sie ein anderes, das multiprocessing ist, die Akten bearbeitend und sie dann löschend, wenn Sie getan werden. Nicht sicher, ob dies die beste Lösung ist? – Gus

+0

Das würde ich tun. -- und TU. --- Sonst könnten Sie Sprachen wechseln und nodejs verwenden, um zu kratzen - aber das ist ein ganz anderer Prozess. – Merlin

Antwort

0

Wenn die Datei nicht größer als Ihr verfügbarer Speicher ist, anstatt es mit dem „offenen“ Verfahren Gebrauch Mmap Öffnung (https://docs.python.org/3/library/mmap.html). Es wird die gleiche Geschwindigkeit geben, als ob Sie mit Speicher und nicht mit einer Datei arbeiten würden.

Verwandte Themen