Fork, oder Thread?

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
PNS-Richi
User
Beiträge: 68
Registriert: Donnerstag 17. Januar 2008, 01:48

Samstag 7. März 2009, 11:31

Hallo,

ich bräuchte mal eure Hilfe bezüglich Fork und Thread.

Ich muss Dateien die zwischen ein paar KB und ein paar Hundert MB groß sind überprüfen und anschliessend ein Resultat zurück liefern, dazu wird das Ergebnis in eine SQLite Datenbank gespeichert. Der Prozess der die Anfragen sendet, sendet auch eine ID Nummer mit, die man ihm zurück liefert. Ohne Fork, oder Thread würde alles stocken, da er immer nur eins nach dem anderen abarbeiten kann und so können 700 MB alles zum stocken bringen.

Würde ich nun Fork nehmen, dann würde er für die SQLite Datenbank immer die Instanze der Klasse neu erstelle müssen und das kostet Zeit(oder?). Bei Thread könnte ich die Instanze der Klasse zwischen den Threads einmal bereit stellen, oder?

Was mir wichtig ist: Es soll Schnell und Ressourcen schonend sein. Ich hätte gerne eine Erkläreung wann ich was einsetzen soll(Fork, Thread). Beispiele wären auch nett. Wichtig ist auch das Ich Daten zwischen den Threads bereit stellen kann - shared memory.

Im Grunde brauch ich mehr Wissen über das Thema.

Danke für eure Hilfe.

lg Richi
lunar

Samstag 7. März 2009, 12:31

Zwei Threads benötigst du wohl, einen Arbeitsthread und einen, der auf Anfragen lauscht. Zwischen diesen kannst du Aufträge über eine Warteschleife austauschen. Dafür ist Threading die einfachere Lösung.

Ob die weitere Parallelisierung des Arbeitsthreads allerdings etwas bringt, bezweifele ich sehr stark.

Ich verstehe deine Beschreibung so, dass der Code vor allem viel IO-Last erzeugt, aber wenig rechenintensiv ist. Daraus folgt für mich, dass Parallelisierung nur zu ungünstigem Disk-IO Verhalten führt, und die Geschwindigkeit im Zweifelsfall sogar eher negativ beeinflusst.

Das liegt daran, dass die Lesegeschwindigkeit der Festplatte weitaus langsamer ist als die Rechengeschwindigkeit deines Prozessors. Sofern du also nicht sehr rechenintensive Dinge ausführst, ist die Berechnung weitaus schneller als die Zeit, die dein Prozess eh schläft, weil er auf den nächsten Block von der Festplatte wartet. Mehrere Threads würden vom IO-Scheduler wahrscheinlich eh nicht hoch priorisiert behandelt, um dein Programm nicht über die Maßen zu bevorzugen. In jedem Fall aber erhöht sich durch mehrere Threads die Lesegeschwindigkeit der Festplatte nicht, was dazu führen wird, dass ein paralleles Programm wahrscheinlich nur einen laufenden Thread/Prozess hat, während alle anderen schlafen und auf Disk-Input warten.
PNS-Richi
User
Beiträge: 68
Registriert: Donnerstag 17. Januar 2008, 01:48

Samstag 7. März 2009, 15:16

Also ich habe nun mein Programm um threadfähigkeit erweitert.

Das Programm ist mehr CPU Lastig. Wenn ich nun z.B.: 30 Einträge aufeinmal sende, kommt ein: Speicherzugriffsfehler.

Bei SQLite habe ich "check_same_thread=False" gesetzt. Ich habe vor mehrere DB Backends einzubeziehen. Einiges liegt in Listen vor, also kommen vll. nur 6 Anfragen von 30 zur SQLite Datenbank.

lg Richi
lunar

Samstag 7. März 2009, 15:30

PNS-Richi hat geschrieben:Das Programm ist mehr CPU Lastig. Wenn ich nun z.B.: 30 Einträge aufeinmal sende, kommt ein: Speicherzugriffsfehler.
Was soll ich jetzt ohne Quellcode dazu sagen?
Bei SQLite habe ich "check_same_thread=False" gesetzt.
SQLite-Verbindungen sind nicht notwendigerweise threadsicher, "check_same_thread" deaktiviert nur die Überprüfung. Davon ist abzuraten.
Einiges liegt in Listen vor, also kommen vll. nur 6 Anfragen von 30 zur SQLite Datenbank.
:?:

Probiere doch erstmal aus, ob du mit einem Server-Thread und einem Arbeitsthread zurande kommst. Dann sparst du dir für den Anfang viele Probleme, da der Austausch zwischen den Threads über einfache Warteschlangen ("queue"-Modul) laufen kann. Die Datenbankverbindung wird dann im Server-Thread nicht benötigt und kann daher ausschließlich im Arbeitsthread leben.

Im Allgemeinen lässt sich ohne Code aber wenig präzises sagen.
PNS-Richi
User
Beiträge: 68
Registriert: Donnerstag 17. Januar 2008, 01:48

Samstag 7. März 2009, 15:43

Hallo,

Speicherzugriffsfehler ist das einzige das als Fehler kommt. Jedenfalls liegt es an SQLite, wenn ich zuviele Anfragen sende. Ich werde eine andere Datenbank wählen.

Ich frag mich nur welches Postgres Python Modul ich nun verwenden soll.

lg Richi
lunar

Samstag 7. März 2009, 15:50

PNS-Richi hat geschrieben:Speicherzugriffsfehler ist das einzige das als Fehler kommt. Jedenfalls liegt es an SQLite, wenn ich zuviele Anfragen sende.
Uh? Der Speicherzugriffsfehler wird durch sqlite verursacht, wenn du zu viele Anfragen sendest? Das glaube ich eher nicht, ich tippe da vielmehr auf einen ungültigen Zugriff aus einem anderen Thread ...
Ich werde eine andere Datenbank wählen.
Eine andere Datenbank ist beim reinen Schreibzugriff nicht notwendigerweise schneller als sqlite.
Ich frag mich nur welches Postgres Python Modul ich nun verwenden soll.
Google und/oder Forumssuche ...
PNS-Richi
User
Beiträge: 68
Registriert: Donnerstag 17. Januar 2008, 01:48

Samstag 7. März 2009, 16:27

Wenn ich z.b. eine Liste verwende statt SQLite für die Daten, dann klappt es. Wann wäre den der Zugriff ungültig bzw. was macht es ungültig?

lg
DasIch
User
Beiträge: 2452
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Samstag 7. März 2009, 16:30

Du kannst nicht gleichzeitig von mehreren Threads auf eine SQLite Datenbank zugreifen. Damit wird das vermutlich zusammenhängen aber es wäre einfacher wenn du einfach mal den Code zeigst, der zu dem Problem führt.
Antworten