2017-09-10 3 views
0

Ich habe eine for-Schleife, die über ein Array iteriert. Für jedes Element im Array ruft es eine Funktion auf, die django-rest-framework-Anfragen stellt. Jeder Funktionsaufruf ist unabhängig von den anderen.optimieren Schleife machen Django-Rest-Framework Anfragen

Wenn das Array 25 Elemente enthält, dauert es derzeit 30 Sekunden. Ich versuche die Gesamtzeit auf weniger als 10 Sekunden zu reduzieren.

Die Hälfte der in der Funktion verbrachten Zeit wird von DRF-Anfragen belegt. Wäre es sinnvoll, die for-Schleife durch einen Multiprocessing-Pool zu ersetzen? Wenn ja, wie kann ich sicherstellen, dass jeder Prozess Anforderungen über eine separate Verbindung mit dem Anforderungspaket stellt?

Ich habe gerade versucht zu ersetzen:

for scenario_id in scenario_ids: 
    step_scenario_partial(scenario_id) 

mit:

pool = Pool(processes=2) 
pool.map(step_scenario_partial, scenario_ids) 

die aufgrund OpenSSL.SSL.Error fehlgeschlagen: [('SSL-Routinen', 'ssl3_get_record', ‚Entschlüsselung fehlgeschlagen ist oder bad record mac ')]

Laut this war der Fehler darauf zurückzuführen, dass dieselbe SSL-Verbindung in mehreren Prozessen erneut verwendet wurde.

Antwort

1

Sie können das concurrent Python-Modul (docs) verwenden, das parallele Aufgaben ausführen kann. Beispiel Verfahren, die eine Liste von Objekten Antwort zurückgibt:

from concurrent import futures 

def execute_all(scenario_ids, num_workers=5): 
    ''' 
    Method to make parallel API calls 
    ''' 
    with futures.ThreadPoolExecutor(max_workers=num_workers) as executor: 
     return [result for result in executor.map(step_scenario_partial, scenario_ids)] 

Die ThreadPoolExecutor verwendet einen Pool von Threads parallel asynchronen Anrufe auszuführen. Sie können mit Werten von num_workers experimentieren, beginnend mit 5, um sicherzustellen, dass die gesamte Ausführungszeit < 10 Sekunden beträgt.

+0

Werden Threads Fehler aufgrund der Wiederverwendung derselben SSL-Verbindung vermeiden, da die Threads nie gleichzeitig ausgeführt werden? – softweave

+1

Haben Ihren Vorschlag ausprobiert. Die Cumtime ging ohne Fehler auf 8,3 Sekunden zurück. – softweave