threading Problem mit Logfiles

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
uschoen
User
Beiträge: 3
Registriert: Montag 14. November 2016, 09:48

Hallo,

ich habe folgendes Problem, und langsam auch einen Knoten im Kopf.

In meinem Projekt habe ich folgendes umgesetzte:

Main Programm:
hier wird ein Log Objekt erstellt(kein Standart ModuL), was div Filter und outputs hat, unter anderen auch Files
dann werden aus dem Main Programm diverse Module geladen und mit hilfe des threading Moduls gestartet. Übergeben wird immer das Log Object, damit der Thread auch Logs schreiben. Alle Module sind "Kinder" von threading.Threads . Auch das Main Programm schreibt einiges.
Die Threads haben nichts miteinanader zu tun, die Kommunikation erfolgt immer von den Threads zum core_object, wo nur Werte gespeichert werden, die der MAIN dann abfragt. Das führt auch zu keinen Problemen.

Code: Alles auswählen


LOG_OBJECT=mylogger.log(ARGS)
core_object=core.mem(ARGS,LOG_OBJECT)

example = MODULx1.PAKAGEy1(core_object,LOG_OBJECT,ARGS)
example.start()
example.join()

example2 = MODULx2.PAKAGEy2(core_object,LOG_OBJECT,ARGS)
example2.start()
example2.join()

while ...
	LOG_OBJECT.write("main lebt noch")
	tu was und find kein ende
...

Das Problem ist die LOG Instance und das auch erst seid ich zum schreiben der Logs in Files folgendes hinzugefügt habe (nur so als kurze Funktions Übersicht mal dargestellt)

Code: Alles auswählen


class log
....
def write (self,msg):
	self._filehandel.write(msg)
	self._filehandel.flush()
	if filesize > 10000:
		self._filehandel.close()
		create zip file...
		remove logfile
		crate new logfile and filehandle 
	return
Ansich lief alles ganz gut. Wenn ich aber mal den Wert für das zippen (filesize) runterschraube und sehr vieleThreads starte (also viele Logs geschrieben werden) knallt es.
Was ganz klar ist:
wenn der Thread gearde den filehandle geschlossen hat bzw den logfile gelöscht hat, und wärend dessen zum nächsten Thread wechselt,
und der nächste Thread auf den write Befehl trift, findet er keine filehandle mehr vor oder auch eine Datei. Hier mit exception zu arbeiten oder das creieren eines Files vorzugreifen, währe sehr unsauber.

Also was währe zu tun ... ich muss sicherstellen, das während des Zippen des Files, der Thread nicht wechselt und er erst mal seine Arbeit beendet. Und hier hängt es mit der LOCK Funktion. Auch wie ich im Main der ja kein Thread ist da mit einbinden kann.
Zuletzt geändert von Anonymous am Mittwoch 16. November 2016, 10:03, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@uschoen: Module sind Kinder von `threading.Thread`? Dann sprechen wir hier aber nicht von Python-Modulen.

Das Beispiel macht keinen Sinn weil da nicht wirklich Nebenläufigkeit existiert. Da wird immer ein Thread gestartet und dann gleich darauf auf dessen Ende gewartet.

Welches konkrete Problem besteht denn mit dem `threading.Lock`? Das muss halt am Anfang der `write()`-Methode angefordert und am Ende wieder freigegeben werden. Am besten mit der ``with``-Anweisung, damit man sicher ist, dass es auch in unvorhergesehenen Fällen auch wieder freigegeben wird.

Mal davon abgesehen das `_filehandel` einen Buchstabendreher enthält, ist so ein Dateiobjekt mehr als ein Handle, was ja letztlich nur eine Zahl oder ein anonymer Zeiger (und damit auch wieder eine Zahl) ist.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@uschoen: die Schreibweise der Variablennamen hält sich nicht an den Style-Guide. Nur Konstanten werden komplett in Großbuchstaben geschrieben. Warum nimmst Du nicht das Standard-logging-Modul? Dafür kann man auch verschiedene Outputhandler schreiben. PAKAGE ist auch falsch geschrieben.
Antworten