Seite 1 von 1

Thread-Interna

Verfasst: Dienstag 22. Mai 2007, 18:09
von Grossmeister_C
Edit (Leonidas): Aus der Diskussion des Threads "Wie zwei Funktionen Gleichzeitig laufen lassen?" abgetrennt.

Ohne das ich mir Dein Programm genau angesehen habe: Innerhalb eines Prozesses wird das wohl nicht möglich sein. Ich würde Threading empfehlen.

Verfasst: Dienstag 22. Mai 2007, 18:15
von Leonidas
Grossmeister_C hat geschrieben:Innerhalb eines Prozesses wird das wohl nicht möglich sein. Ich würde Threading empfehlen.
Und seit wann ist Threading innerhalb eines Prozesses nicht möglich? :shock: Ich würde sogar so weit gehen, dass Threading (zumindest im Userspace) nur innerhalb von Prozessen möglich ist - jeder Prozess hat mindestens einen Thread.

Verfasst: Dienstag 22. Mai 2007, 18:33
von Grossmeister_C
Leonidas hat geschrieben:
Grossmeister_C hat geschrieben:Innerhalb eines Prozesses wird das wohl nicht möglich sein. Ich würde Threading empfehlen.
Und seit wann ist Threading innerhalb eines Prozesses nicht möglich? :shock: Ich würde sogar so weit gehen, dass Threading (zumindest im Userspace) nur innerhalb von Prozessen möglich ist - jeder Prozess hat mindestens einen Thread.
Du hast mich falsch verstanden. Ich meinte das es nicht möglich ist 2 Funktionen gleichzeitig innerhalb eines einzelnen Prozesses auszuführen.

Gut , wenn wir Erbsen zählen wollen sind natürlich verschiedene Threads eines Prozesses zumindest teilweise auch dem Prozess zugehörig.

Verfasst: Dienstag 22. Mai 2007, 19:16
von Leonidas
Grossmeister_C hat geschrieben:Du hast mich falsch verstanden. Ich meinte das es nicht möglich ist 2 Funktionen gleichzeitig innerhalb eines einzelnen Prozesses auszuführen.
Kann man aber. Ok, wenn man ganz detailiert sein will geht das mit einer CPU nicht, aber mit zwei ist sowas durchaus technisch möglich (aber mit einer CPU kann man wenn man ganz genau ist, auch nur einen Prozess gleichzeitig laufen lassen, trotzdem gibt es Multiprocess-Betriebssysteme). Von Python-Sicht geht das mit dem GIL nicht ganz so gut, weil nur ein Thread Python-Code im selben Moment ausführen kann (C-Module gehen aber in mehreren Threads). Aus Nutzersicht ist das Switching in der Regel ausreichend schnell, so dass er das Gefühl von Gleichzeitigkeit hat. Ich glaube auch, dass es einfach darum geht. Ob der Code gleichzeitig ausgeführt wird oder nicht ist mir als Nutzer völlig egal - ebenso egal wie es implementiert wird, ob nun als Thread/Tasklet/Greenlet oder was auch immer.
Grossmeister_C hat geschrieben:Gut , wenn wir Erbsen zählen wollen sind natürlich verschiedene Threads eines Prozesses zumindest teilweise auch dem Prozess zugehörig.
Und wem ist dann der Rest zugehörig?

Ich glaube wirklich, dass wir irgendwie an uns vorbeisprechen.. vielleicht sehen wir die Sache ja aus zwei verschiedenen Sichtweisen?

Verfasst: Dienstag 22. Mai 2007, 19:16
von mitsuhiko
Grossmeister_C hat geschrieben:Gut , wenn wir Erbsen zählen wollen sind natürlich verschiedene Threads eines Prozesses zumindest teilweise auch dem Prozess zugehörig.
Teilweise?

Verfasst: Dienstag 22. Mai 2007, 19:42
von Grossmeister_C
blackbird hat geschrieben:
Grossmeister_C hat geschrieben:Gut , wenn wir Erbsen zählen wollen sind natürlich verschiedene Threads eines Prozesses zumindest teilweise auch dem Prozess zugehörig.
Teilweise?
Kommt immer drauf an ob User- oder Kernelthread nicht wahr ? Ich weiß jetzt nicht genau wie Pythonthreads im0plementiert sind. Kernelthreads verwenden aber z.B. jeder einen eigenen Stack.

Verfasst: Dienstag 22. Mai 2007, 19:52
von Grossmeister_C
Leonidas hat geschrieben:
Grossmeister_C hat geschrieben:Du hast mich falsch verstanden. Ich meinte das es nicht möglich ist 2 Funktionen gleichzeitig innerhalb eines einzelnen Prozesses auszuführen.
Kann man aber. Ok, wenn man ganz detailiert sein will geht das mit einer CPU nicht, aber mit zwei ist sowas durchaus technisch möglich (aber mit einer CPU kann man wenn man ganz genau ist, auch nur einen Prozess gleichzeitig laufen lassen, trotzdem gibt es Multiprocess-Betriebssysteme).
Ja, das mag theoretisch machbar sein, aber ich gehe hier von einer üblichen 1-Cpu-Umgebung aus.
Leonidas hat geschrieben: Von Python-Sicht geht das mit dem GIL nicht ganz so gut, weil nur ein Thread Python-Code im selben Moment ausführen kann (C-Module gehen aber in mehreren Threads). Aus Nutzersicht ist das Switching in der Regel ausreichend schnell, so dass er das Gefühl von Gleichzeitigkeit hat. Ich glaube auch, dass es einfach darum geht. Ob der Code gleichzeitig ausgeführt wird oder nicht ist mir als Nutzer völlig egal - ebenso egal wie es implementiert wird, ob nun als Thread/Tasklet/Greenlet oder was auch immer.
So geau weiß ich bei Python nicht bescheid, mir ging es nur darum das man schon Threads oder einen 2. Prozess bemühen muss um das gewünschte zu erreichen.
Grossmeister_C hat geschrieben:Gut , wenn wir Erbsen zählen wollen sind natürlich verschiedene Threads eines Prozesses zumindest teilweise auch dem Prozess zugehörig.
Und wem ist dann der Rest zugehörig?[/quote]

Falsche Wortwahl meinerseits. Der Rest ist zwar dem Thread und damit auch dem Parentprozess zugehörig. Der Thread teilt aber z.B. nicht denselben Stack.

Verfasst: Dienstag 22. Mai 2007, 20:13
von BlackJack
Threads benutzen nie den selben Stack, egal ob Kernel- oder User-Level. Das würde gar nicht funktionieren.

Verfasst: Dienstag 22. Mai 2007, 20:18
von Grossmeister_C
Eben

Verfasst: Dienstag 22. Mai 2007, 20:43
von BlackJack
Häh? Weisst Du noch was Du so geschrieben hast? Jeder dieser Stacks gehört natürlich zu dem Prozess zu dem die Threads gehören. Threads gehören nicht nur "teilweise" zu einem Prozess, sondern komplett.

Verfasst: Dienstag 22. Mai 2007, 20:54
von Grossmeister_C
BlackJack hat geschrieben:Häh? Weisst Du noch was Du so geschrieben hast? Jeder dieser Stacks gehört natürlich zu dem Prozess zu dem die Threads gehören. Threads gehören nicht nur "teilweise" zu einem Prozess, sondern komplett.
Ja , ich weiß noch was ich geschrieben habe. Wie schon erwähnt habe ich mich mißverständlich ausgedrückt. Sicherlich gehört der neue Thread zu dem Prozess. Aber er teilt nicht alles mit diesem.

Ich wollte ursprünglich auch nur ausdrücken das man nicht einfach 2 Funktionen eines Programmes ohne Zuhilfenahme eines neuen Threads oder eines weiteren Prozesses gleichzeitig ausführen kann.

Wie dem auch sei. anscheinend habe ich mich unverständlich ausgedrückt. Bin schon ein wenig müde.

Verfasst: Dienstag 22. Mai 2007, 22:05
von Leonidas
Grossmeister_C hat geschrieben:Ja, das mag theoretisch machbar sein, aber ich gehe hier von einer üblichen 1-Cpu-Umgebung aus.
Das ist nur im Moment so. Sogar der Laptop der neben mir steht hat nicht nur Hyper Threading (das reicht wohl nicht und wurde zumindest vorerst abgeschafft) sondern zwei Cores und ich denke in Zukunft wird sich dieser Trend fortsetzen. Damit sollte das parallele Ausführen zweier Programme durchaus drin sein :)
Grossmeister_C hat geschrieben:So geau weiß ich bei Python nicht bescheid, mir ging es nur darum das man schon Threads oder einen 2. Prozess bemühen muss um das gewünschte zu erreichen.
Klar, aber das ist eigentlich eher die Regel als die Ausnahme. Was noch Ähnlich ist, ist ``asyncore`` bzw. Twisted. Naja und Sprachen die besonders für Concurrency gedacht sind, also Erlang.

Verfasst: Dienstag 22. Mai 2007, 22:40
von thelittlebug
Kann sich hier bitte ein Mod einschalten, das Thema artet aus :D

lgherby :D

Verfasst: Mittwoch 23. Mai 2007, 08:18
von Lambda
Leonidas hat geschrieben: Kann man aber. Ok, wenn man ganz detailiert sein will geht das mit einer CPU nicht, aber mit zwei ist sowas durchaus technisch möglich (aber mit einer CPU kann man wenn man ganz genau ist, auch nur einen Prozess gleichzeitig laufen lassen, trotzdem gibt es Multiprocess-Betriebssysteme). Von Python-Sicht geht das mit dem GIL nicht ganz so gut, weil nur ein Thread Python-Code im selben Moment ausführen kann (C-Module gehen aber in mehreren Threads). Aus Nutzersicht ist das Switching in der Regel ausreichend schnell, so dass er das Gefühl von Gleichzeitigkeit hat. Ich glaube auch, dass es einfach darum geht. Ob der Code gleichzeitig ausgeführt wird oder nicht ist mir als Nutzer völlig egal - ebenso egal wie es implementiert wird, ob nun als Thread/Tasklet/Greenlet oder was auch immer.
verstehe ich nicht, auf einem 1CPU system macht das durchaus nen sin, aber unter einem 2CPU+ system wäre doch threading unter python fast sinnlos?

Verfasst: Mittwoch 23. Mai 2007, 08:55
von BlackJack
Auf Systemen mit mehreren CPUs oder Kernen macht Threading in Python genausoviel oder wenig Sinn wie bei Ein-Prozessorsystemen. In beiden Fällen bringt es nicht viel, wenn das Problem CPU-lastig ist, aber in beiden Fällen macht es sehr wohl Sinn, wenn es E/A-lastig ist und immer wenn ein Thread bei E/A-Operationen blockiert, ein andere die Zeit nutzen kann.