Gibt es etwas Ähnliches wie Java's Thread.yield () in Python? Macht das überhaupt Sinn?

8

Ich möchte meinen Python-Threads sagen, dass sie nachgeben sollen, und so vermeiden, dass die CPU unnötig belastet wird. In Java könnten Sie das mit der Funktion Thread.yield() tun. Ich glaube nicht, dass es in Python etwas Ähnliches gibt, also habe ich time.sleep(t) wo t = 0.00001 verwendet. Für t=0 scheint es keinen Effekt zu geben.

Ich denke, dass es etwas gibt, was ich nicht richtig über das Threading-Modell von Python verstehe und daher der Grund für das fehlende thread.yield() . Kann mir das jemand erklären? Vielen Dank!

PS: Das sagt die Dokumentation für Java Thread.yield() :

  

Bewirkt den aktuell ausgeführten Thread   Objekt vorübergehend anhalten und zulassen   andere auszuführende Threads.

    
Carlos 15.12.2009, 15:30
quelle

3 Antworten

3

Der Interpreter wechselt automatisch von einem Thread zum anderen, ohne dass Sie eingreifen müssen - Sie müssen dem System nicht sagen, dass es keinen Thread "hacken" soll.

Unter normalen Umständen wird jedoch immer nur ein Python-Thread ausgeführt. (Ausnahmen neigen dazu, sich um Zeiten zu drehen, in denen Threads auf Eingaben von externen Geräten wie der Festplatte oder dem Netzwerk warten.) Dies liegt an der Globale Interpretersperre . Dies bedeutet jedoch, dass Sie in Python wahrscheinlich weniger von Threads profitieren als in Java oder vielen anderen Sprachen. Es ist nicht unbedingt trivial, dieses Problem zu umgehen, obwohl der Wechsel zu Multiprocessing anstelle von Multithreading nach Möglichkeit ein guter Ansatz ist.

Was Sie jedoch tun möchten, scheint in gewisser Hinsicht fehlerhaft zu sein - wenn Sie zwei Threads haben und beide etwas zu tun haben, sollten Sie keinen anwendungsseitigen Code schreiben müssen, um zwischen ihnen zu wechseln. Das ist die Aufgabe des Betriebssystems oder der virtuellen Maschine. Wenn Sie einen Thread dazu bringen, weniger zu tun, weil Sie einen anderen Thread in Bezug auf die Prozessorzeit bevorzugen möchten, sollten Sie statt zufälliges Nachgeben oder Nachlassen lieber Thread-Prioritäten setzen. (Obwohl dies in Python angesichts des Vorhandenseins des Global Interpreter Locks möglicherweise nicht viel Bedeutung hat.)

    
Kylotan 15.12.2009, 15:43
quelle
0

Thread.yield () fehlt in Python, weil es vielleicht vergessen wurde, oder der Designer dachte, dass alle Probleme der Synchronisation und Interprozesskommunikation ohne Thread.yield () lösbar sind.

Ich würde Thread.yield () für das folgende Problem verwenden:

z. Es gibt eine Jobwarteschlange und zwei Worker-Threads, die Einträge aus der Jobwarteschlange abrufen und Einträge in die Jobwarteschlange platzieren können. Eine Möglichkeit, dies zu lösen, ist die Verwendung der threading.Condition-Klasse. Wenn der Worker "B" einen Warteschlangeneintrag abrufen möchte, die Warteschlange jedoch leer ist, wird der Wartezustand (Condition.wait ()) aktiviert. Wenn der Arbeiter 'A' den Eingang in die Warteschlange stellt, weckt er den Arbeiter 'B' (Condition.notify ()) auf. An dieser Stelle ist das Nachgeben von wesentlicher Bedeutung, denn wenn Arbeiter 'A' hier nicht nachgibt, kann Arbeiter 'A' die Aufgabe vor dem aufgeweckten Arbeiter 'B' holen, was eine Rassenkondition verursacht.

Ich frage mich, wie es ohne Thread.yield () gelöst werden kann.

    
Endre 09.07.2016 09:00
quelle

Tags und Links