Python: Methode für N Instanzen parallel aufrufen

tobiii

tobiii

Aktives Mitglied
Thread Starter
Dabei seit
20.05.2006
Beiträge
1.226
Reaktionspunkte
40
Hallo Leute!

Ist zwar eine Python Frage, dachte aber ihr seid bestimmt liberal genug auch diesen kleine Thread hier zu akzeptieren :)

Ich baue gerade ein kleines Programm, das von der Yahoo finance api Wechselkurse in bestimmten Abstanden abruft und diese dann nach x Abrufen irgendwann weiter verarbeitet. Dazu habe ich eine Klasse currencyStream definiert, welche jeweils die zeitliche Entwicklung eines Wechselkurses (z.B. USD zu EUR) abbildet.

Diese Klasse besitzt eine Methode, die es der jeweiligen Instanz erlaubt, den aktuellen Wechselkurs zu erfragen und diese Information dann entsprechend zu speichern. Der Aufruf dieser Methode dauert jeweils ca. 1-2 Sekunden, diese Dauer wird massgeblich von der Reaktionszeit des yahoo-Servers bestimmt.

Das Programm verwaltet mehrere dieser Wechselkurse, z.b. im Beispiel weiter unten 3 Stück. Aktuell werden die Instanzen in einem Dictionary verwaltet.

Wenn ich jetzt mit dem Code weiter unten diese 3 Instanzen nacheinander update, dann benötigt der Vorgang 6 Sekunden, wobei zu 99% oder mehr nur auf die yahoo Antwort gewartet wird.

Codebeispiel:

Code:
sd={"MYREUR":cy.CurrencyStream('MYR','EUR'), "USDEUR":cy.CurrencyStream('USD','EUR'),"SGDEUR":cy.CurrencyStream('SGD','EUR')}

An dieser Stelle werden die 3 Instanzen initialisiert, sd ist das Dictionary das alle Instanzen verwaltet.

Im Modul cy gibt es nun eine Funktion, die alle Instanzen die in einem Dictionary zusammengefasst sind updatet:

Code:
def runUpdateCycle(streamdict):
		for x in streamdict.values():
			x.addCurrentRate()

Wenn ich auf diese Weise mehr als z.B 10 verschiedene Wechselkurse in einem Intervall von 10 Sekunden abfragen möchte, dann kommt das Programm mit dem updaten nicht mehr hinterher.

Welche Möglichkeiten seht ihr, die Methode addCurrentRate() für die einzelnen Instanzen, die in dem Dictionary verwaltet werden, parallel aufzurufen, d.h. die Dauer des Aktualisierungsvorgangs in etwa auf nahezu den einfachen Aufruf zu reduzieren?

Viele Grüße und vielen Dank für eure Ratschläge im Voraus!!!!

Einen schönen Abend,

Tobi
 
Zuletzt bearbeitet:
So wie du das programmierst, wird alles immernoch sequenziell abgearbeitet. Wenn du die Instanzen parallel abarbeiten willst, benötigst du Threads. Schau dir mal Stackless Python und Microthreds hier oder auch hier an.

Gruß Carsten
 
Danke für die schnelle Antwort!

Ich hab auch schon mal rudimentäre versuche Unternommen, mit Theras in der runUpdateCycle Funktion zu arbeiten, diese Versuche waren jedoch bisher noch in kleinster Weise von Erfolg gekrönt :)

Danke schonmal für die Links, werde mir die entsprechenden Artikel nach dem Kochen sofort anschauen!
 
Nachdem ich jetzt mal die Infos zu Stackless quer gelesen habe bin ich zum Schluss gekommen, dass diese Lösung wohl für meine Anwendung "mit Kanonen auf Spatzen geschossen" wäre.

Ich werd erst einmal versuchen, mit dem Standard threads-Modul von Python einzusteigen.

Für weitere Anregungen und Vorschläge bin ich natürlich immer offen :)

Viele Grüße,

Tobi
 
Schon gefunden, das deckt sich ja ziemlich mit meiner Aufgabe :) Danke!


Tobi
 
So, kurzes Update, kann Verzug melden :)
Wie erwartet verkürzt sich (im Rahmen meiner bescheidenen Messgenauigkeit) zumindest für eine überschaubare Anzahl an Wechselkursen N die Dauer eines kompletten Update-Zykluses um einen Faktor N.


Ein sehr gutes Beispiel auf das ich mich perfekt stützen konnte war dabei folgender Artikel:

http://lethain.com/parallel-http-requests-in-python/
 
Zurück
Oben Unten