Daten paralleler Prozesse über Datenbank austauschen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Hi,

Ich will Logging über mehrere Kindprozesse hinweg ermöglichen, ähnlich wie mit dem QueueHandler:
http://plumberjack.blogspot.de/2010/09/ ... ssing.html
Meine Anforderung besteht nun darin, dass die Prozesse abgebrochen werden können, ohne das Logging zu behindern. Der Doku zufolge kann es aber zu Problemen führen, wenn man Prozesse mit terminate beendet, falls man mit diesen über eine Queue kommuniziert:http://docs.python.org/2/library/multip ... .terminate
Warning

If this method is used when the associated process is using a pipe or queue then the pipe or queue is liable to become corrupted and may become unusable by other process. Similarly, if the process has acquired a lock or semaphore etc. then terminating it is liable to cause other processes to deadlock.
Ich habe mir zuerst gedacht den Fehler abzufangen und an alle Prozesse eine neue, funktionierende Queue zu verteilen. Das scheint aber nicht trivial zu sein:
http://stackoverflow.com/questions/1337 ... upt-queues
Ich habe auch schon angefangen einen SocketHandler einzubauen, ich bin mir aber zum einen nich sicher wie Prozessthreadsicher es ist das Socket, bzw. die Instanz davon mit mehreren Kindprozessen zu teilen. Zum Anderen muss ich dann vermutlich umständlich unvollständig geschickte Nachrichten herausfiltern. Also irgendwie wird mir das zu umständlich.

Ich brauche doch im Prinzip nur eine Datenbank, die Prozessthreadsicher ist. Da multiprocessing und das logging Modul sich dem Problem offensichtlich nicht annehmen, frage ich also hier nach, was man da am einfachsten nehmen kann um einen MultiprocessHandler für das Logging Modul zu schreiben.

[EDIT2] Welche Datenbank kann ich unter Linux verwenden um möglichst einfach Strings von parallen laufenden Kindprozessen zu einem Elternprozess zu übermitteln?
Dabei soll möglichst wenig Overhead entstehen und am besten nichts zusätzliches installiert werden müssen. Die Datensätze sollen nicht kaputt gehen, wenn der Prozess abgebrochen wird, aber das sollte man von einer Datenbank herkömmlicher Weise erwarten können, oder? Soll ich einfach sqlite nehmen?

Thx,
Boa
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Also der sqlite FAQ zufolge muss man in jedem Prozess eine neue Verbindung zur Datenbank erstellen:
Under Unix, you should not carry an open SQLite database across a fork() system call into the child process. Problems will result if you do.
Außerdem muss man handler implementieren, die z.B. den Zugriff sooft wiederholen, bis die Datei nicht mehr gelocked ist:
When SQLite tries to access a file that is locked by another process, the default behavior is to return SQLITE_BUSY. You can adjust this behavior from C code using the sqlite3_busy_handler() or sqlite3_busy_timeout() API functions.
Das versuche ich umzusetzen. Vielleicht hat noch jemand einen Tipp, was man beachten muss.
Antworten