reload von Mudulen unter Vermeidung von reload()

07/02/2009 - 16:33 von Albert Hermeling | Report spam
Moin,

wie der Betreff schon andeutet geht es um das neu laden von Modulen. Da die
Funktion reload() möglichst vermieden werden soll und in meinem Programm
das Paket multiprocessing und dort die Klasse Process gebraucht wird, kam
ich auf folgende Idee, um beim restart die Module, die der Server
gebraucht, neu zu laden:

from multiprocessing import Process

class Server(Process):
def __init__(self,):
Process.__init__(self,)
def run(self,):
from MyServerClass import Aplikation # <-- wichtig
self.aplikation = Aplikation()


class ServerWrapper(object):
def __init__(self,):
self.server = None

def start(self,):
self.server = Server()
self.server.start()

def stop(self,):
self.server.terminate()
self.server = None

def restart(self,):
self.stop()
self.start()

Wenn ich die import Anweisung für MyServerClass in run() aufrufe
funktioniert es wie gewünscht, heißt das Modul MyServerClass wird neu
geladen.

Bevor ich es jetzt in die Praxis umsetze, gibt es da noch irgendwelche
Fallstricke, bzw. Was haltet ihr von diesem vorgehen?

Mit freundlichen Grüßen

Albert
 

Lesen sie die antworten

#1 Diez B. Roggisch
07/02/2009 - 16:43 | Warnen spam
Albert Hermeling schrieb:
Moin,

wie der Betreff schon andeutet geht es um das neu laden von Modulen. Da die
Funktion reload() möglichst vermieden werden soll




Wieso solle es das?



und in meinem Programm
das Paket multiprocessing und dort die Klasse Process gebraucht wird, kam
ich auf folgende Idee, um beim restart die Module, die der Server
gebraucht, neu zu laden:

from multiprocessing import Process

class Server(Process):
def __init__(self,):
Process.__init__(self,)
def run(self,):
from MyServerClass import Aplikation # <-- wichtig
self.aplikation = Aplikation()



<useless_spelling_correction>
Auch im deutschen schreibt man Applikation mit zwei p
</useless_spelling_correction>



class ServerWrapper(object):
def __init__(self,):
self.server = None

def start(self,):
self.server = Server()
self.server.start()

def stop(self,):
self.server.terminate()
self.server = None

def restart(self,):
self.stop()
self.start()

Wenn ich die import Anweisung für MyServerClass in run() aufrufe
funktioniert es wie gewünscht, heißt das Modul MyServerClass wird neu
geladen.

Bevor ich es jetzt in die Praxis umsetze, gibt es da noch irgendwelche
Fallstricke, bzw. Was haltet ihr von diesem vorgehen?



Es tut halt schlicht nicht das, was du denkts was es tut. Weswegen du es
dir auch sparen kannst.

Man kommt um reload nicht herum, wenn man ein Modul neuladen will. Einen
import lazy zu machen veraendert daran nichts.

Ich kenne mich mit dem neuen mp-modul nicht aus, habe aber Wunderdinge
gehoert. Wie auch immer, wenn der Neustart tatsaechlich einen neuen
Prozess spawnt, ist damit eh dafuer gesorgt, das ein import wieder zum
ersten mal passiert.

Diez

Ähnliche fragen