Heim  >  Artikel  >  Backend-Entwicklung  >  Codebeispiele für Produzenten- und Verbraucheroperationen von Python-Bedingungsobjekten

Codebeispiele für Produzenten- und Verbraucheroperationen von Python-Bedingungsobjekten

Y2J
Y2JOriginal
2017-05-04 11:19:091781Durchsuche

Dieser Artikel stellt hauptsächlich die Produzenten- und Verbraucheroperationen von Python-Bedingungsvariablen vor und analysiert die Konzepte, Prinzipien und Thread-Operations-bezogenen Fähigkeiten von Python-Bedingungsvariablen in Form spezifischer Beispiele.

Das Beispiel in diesem Artikel beschreibt die Produzenten- und Konsumentenoperationen von Python-Bedingungsvariablen. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Mutex-Sperre ist der einfachste Thread-Synchronisationsmechanismus. Um komplexe Thread-Synchronisationsprobleme zu bewältigen, stellt Python auch das Objekt Condition bereit. Bedingung wird als Bedingungsvariable bezeichnet. Zusätzlich zur Bereitstellung von Erfassungs- und Freigabemethoden wie Lock bietet sie auch Warte- und Benachrichtigungsmethoden. Der Thread erfasst zunächst eine Bedingungsvariable und bestimmt dann einige Bedingungen. Wenn die Bedingungen nicht erfüllt sind, führen Sie eine Verarbeitung durch, um die Bedingungen zu ändern, und benachrichtigen Sie andere Threads über die Benachrichtigungsmethode. Andere Threads im Wartezustand beurteilen die Bedingungen neu nach Erhalt der Benachrichtigung. Dieser Vorgang wird kontinuierlich wiederholt, um komplexe Synchronisationsprobleme zu lösen. Man kann davon ausgehen, dass das Condition-Objekt eine Sperre (Lock/RLock) und einen Wartepool verwaltet. Der Thread erhält das Condition-Objekt durch Acquire. Wenn die Wartemethode aufgerufen wird, gibt der Thread die Sperre innerhalb der Bedingung auf, wechselt in den blockierten Zustand (blockiert jedoch nicht den aktuellen Thread) und zeichnet diesen Thread im Wartepool auf. Wenn die Notify-Methode aufgerufen wird, wählt das Condition-Objekt einen Thread aus dem Wartepool aus und weist ihn an, die Acquire-Methode aufzurufen, um zu versuchen, die Sperre zu erhalten. Der

-Konstruktor

des

Condition-Objekts kann ein Lock/RLock-Objekt als Parameter akzeptieren. Wenn nicht angegeben, erstellt das Condition-Objekt intern ein RLock. Das klassische Problem der Thread-Synchronisation – das Producer- und Consumer-Problem lässt sich einfach mithilfe von Bedingungsvariablen lösen.

Der obige Code geht davon aus, dass Verbraucher relativ schnell konsumieren, und das Ausgabeergebnis lautet:
import threading
import time
class Producer(threading.Thread):
  def init(self):
    threading.Thread.init(self)
  def run(self):
    global count
    while True:
      con.acquire()
      if count <20:
        count += 1
        print self.name," Producer product 1,current is %d" %(count)
        con.notify()
      else:
        print self.name,"Producer say box is full"
        con.wait()
      con.release()
      time.sleep(1)
class Consumer(threading.Thread):
  def init(self):
    threading.Thread.init(self)
  def run(self):
    global count
    while True:
      con.acquire()
      if count>4:
        count -=4
        print self.name,"Consumer consume 4,current is %d" %(count)
        con.notify()
      else:
        con.wait()
        print self.name," Consumer say box is empty"
      con.release()
      time.sleep(1)
count = 0
con = threading.Condition()
def test():
  for i in range(1):
    a = Consumer()
    a.start()
  for i in range(1):
    b =Producer()
    b.start()
if name==&#39;main&#39;:
  test()

Das obige ist der detaillierte Inhalt vonCodebeispiele für Produzenten- und Verbraucheroperationen von Python-Bedingungsobjekten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn