Hallo Zusammen,
ich bin seit einiger Zeit nach einer sauberen Lösung für mein Problem. Ich baue mir aktuell diverse Wiederverwendbare Module u.a. arbeite ich an mehreren Klassen zum Thema Multithreading. Dabei bin ich auf gewisse "Probleme" gestoßen. U.a. Aufruf verschiedener Funktionen etc... also bin ich auf die Idee gekommen die Module queue und functools zu verwenden. Ich bin auch zu einer funktionierenden aktuell aber unschönen und vor allem unflexiblen Lösung gekommen. Vor allem die Rückgabe der "fertigen" Jobs ist zwar wie bereits in meinem Szenario funktional mehr aber auch nicht. Daher erhoffe ich mir einen kleinen Denkanstoß.
Jobklasse:
import functools
class Job(object):
"""Die Job-Klasse wird hier verwendet um Funktionsaufrufe inkl. Aufrufparameter und einen Callback aufzunehmen.
weiterhin stellt die Klasse einige Meta-Daten zu den Jobs zur Verfügung, u.a. wann diese Erzeugt wurden und wie
oft bereits versucht wurde diese auszuführen. Die Instanzattribute callback und workcounter sind von außen
zugreifbar. Im Error Handling sollte der workCounter hoch gezählt werden, damit ein Job nicht in einer Dauerschleife
läuft. Der Callback kann verwendet werden, wenn die erzeugten Daten direkt an eine weitere funktion oder Methode
übergeben werden soll."""
def __init__(self, function, callback=None, *args, **kwargs):
"""In der init-Methode werden die Funktion, die Aufrufparameter und der Callback entgegen genommen. Weiterhin
wird die Zeit gesetzt zu der die Instanz erzeugt wurde und der WorkCounter auf 0 gesetzt"""
self.logger = logging.getLogger(__name__) # Logger wird aktuell nicht verwendet bzw. nur zu debuggingzwecken
self.function = function
self.args = list(args)
self.kwargs = kwargs
self.created = time.time()
self.callback = callback
self.workcounter = 0
def __repr__(self):
msg = "function: "+ str(self.function) +" args: "+ str(self.args) +" created "+ str(self.created) +" callback "+ str(self.callback) +" kwargs "+ str(self.kwargs)
return msg
def getJob(self):
"""Die Methode get-Job hat als Rückgabe die Funktion und die Argumente, je nach Anzahl dieser"""
#self.logger.debug(str(self.args))
if len(self.args) == 0:
return self.function
elif len(self.args) == 1:
return functools.partial(self.function, self.args[0])
elif len(self.args) == 2:
return functools.partial(self.function, self.args[0], self.args[1])
elif len(self.args) == 3:
if self.kwargs:
return functools.partial(self.function, self.args[0], self.args[1], self.args[2], **self.kwargs)
else:
return functools.partial(self.function, self.args[0], self.args[1], self.args[2])
elif len(self.args) == 4:
return functools.partial(self.function, self.args[0], self.args[1], self.args[2], self.args[3])
else:
return functools.partial(self.function, self.args)
Alles anzeigen
Das Problem besteht in der Methode getJob(). Hier bin ich doch eben sehr unflexibel. Die Klasse wird mit den verschiedensten Funktionen aufgerufen, wobei verschiedene Parameter verwendet werden.
Beispiel für einen Aufruf:
import random
def testfunc(param1, param2):
return param1 + param2
variable = Job(testfunc, None, random.randint(1,222), random.randint(1,222))
result1 = variable()
Alles anzeigen
Allerdings könnte es auch sein, dass der Aufrufparameter eine Liste oder ein Tuple ist. An der Stelle fehlt mir grade die Idee wie ich das ganze flexibler gestalten kann. Die Job an sich werden in eine Queue gelegt und später von entsprechenden workerthreads abgearbeitet, die Ausschnitte habe ich mir hier aber mal gespart, da sie nichts mit dem eigentlichen Problem zu tun haben.
Ich hoffe der ein oder andere kann mir entsprechende Tipps geben. Wahrscheinlich stehe ich gerade einfach nur auf dem Schlauch und habe die Lösung quasi schon vor Augen.
Danke für eure hilfe
gruß
ardani