Meine Anwendung verwendet mehrere E/A-Blockierung (Netzwerk) Anforderungen, die eine Weile dauern, um abzuschließen. Ich habe versucht, Multi Threading zu verwenden, aber es scheint keine Beschleunigung zu bringen, ich vermute, es hat etwas mit Pythons GIL zu tun.Python Multi Threading mit blockierenden E/A
Die Sache ist, dass alle Anfragen gleichzeitig erledigt werden können und keine Abhängigkeiten voneinander haben. Wie löse ich dieses Leistungsproblem?
Mein Code
import threading
import urllib2
import time
def send_request(url, count_str):
start_time = time.time()
urllib2.urlopen(url)
print "Request " + count_str + " took " + str(time.time() - start_time) + " started at " + str(start_time)
count = 0
for url in open('urllist.txt'):
t = threading.Thread(target=send_request, args = (url.strip(), str(count)))
t.start()
count+=1
Der Ausgang ist
Request 1 took 5.0150949955 started at 1458789266.78
Request 2 took 10.0112490654 started at 1458789266.79
Request 0 took 15.024559021 started at 1458789266.78
Request 3 took 20.016972065 started at 1458789266.79
Die Urls in urllist.txt Punkt auf einem Server ich lokal ausgeführt werde, dass 5 Sekunden dauern, zu reagieren. Wie Sie sehen können, "starten" alle zur gleichen Zeit, aber sie blockieren.
Sie können uns Ihren Code zeigen :) – Signal
@Signal aktualisiert it =) Ich bin sehr neu in Multithreading in Python so könnte ziemlich viel falsch damit sein –
Wie soll 'q.join()' zurückgeben? Nichts in Ihrem Code verarbeitet die 'Queue' zum Aufruf von' .get() 'geschweige denn' .task_done() '. Du gibst auch nichts von 'get_and_read_url' zurück, also gibst du nur 'None' in die Warteschlange. Abschließend möchte ich noch folgendes anmerken: Für das Threading im Allgemeinen und insbesondere für die Warteschlangen ist Python 2 _bad_; Wenn Sie zu neuerem Python wechseln können ([3.2 oder später] (https://docs.python.org/3/whatsnew/3.2.html#multi-threading)), bedeutet das umgeschriebene GIL, dass Sie beim Threading nichts gewinnen Bei CPU-gebundenen Tasks läuft es nicht wesentlich langsamer und verbraucht nur GIL-Overhead. – ShadowRanger