Erläuterungen einige Python-Code

Dies ist ein grundlegendes Beispiel für eine Barriere, wie einige Fäden gewartet werden, um eine Barriere für einen Eingang und eine andere Barriere für einen Ausgang zu betreten.
Obwohl der Code gut ist, verstehe ich nicht genau, wie es funktioniert …
Zum Beispiel verstehe ich nicht, warum ein Thread, der in die Barriere () -Funktion eintritt, nachdem er n = n-1 hat, sofort n = n + 1 machen kann und so die globale n … beeinflusst? Warum es scheint, wie alle Threads, nachdem sie n = n-1 Stop irgendwo, und dann machen sie n = n + 1 in Synchronisation?

import threading import time import random bar1= threading.Semaphore(value=0) bar2= threading.Semaphore(value=0) region= threading.Semaphore(value=1) threads= 10 n= thread threadlist= [] def usage(x): for i in range(2): print "[ENTER]: ",x barrier() print "[EXIT]: ",x barrier() def barrier(): global bar1,bar2, region,n,threads region.acquire(); n = n - 1; if n==0: for i in range(threads): bar1.release(); region.release(); bar1.acquire(); region.acquire() n = n + 1 if n == threads: for i in range(threads): bar2.release() region.release() bar2.acquire() random.seed() for i in range(threads): thread = threading.Thread(target=usage, args=(i,)) thread.start() threadlist.append(thread) for i in range(len(threadlist)): threadlist[i].join() 

One Solution collect form web for “Erläuterungen einige Python-Code”

n ist die Anzahl der Fäden, die noch den Rendezvous-Punkt erreichen müssen. region ist ein Mutex, der Zugang zu n . bar1 und bar2 sind Semaphoren, die die Anzahl der Threads angeben, die fortfahren können, initialisiert auf 0.

Im ersten Teil der barrier() tritt jeder Thread wiederum ein, verringert n und blockiert auf dem bar1 Semaphore. Der letzte Thread, der einträgt (derjenige, der n == 0 macht) platziert die Semaphor- threads mal, so dass viele Threads weitergehen können.

Der zweite Teil ist symmetrisch zum ersten, diesmal wartet auf den letzten Thread inkrementieren n .

  • Gibt es irgendwelche eingebauten Funktionen, die auf I / O blockieren, die nicht zulassen, dass andere Threads laufen?
  • Python Multithreaded ZeroMQ REQ-REP
  • Wie bekomme ich QThreads, um in einem Konsolen-PySide-Programm zu arbeiten?
  • Wäre verdreht eine gute Wahl für den Aufbau eines Multi-Thread-Servers?
  • Qthread verriegelt Gui PySide
  • Single Worker Thread für alle Aufgaben oder mehrere spezifische Mitarbeiter?
  • Warum Python Multiprocessing Manager produzieren Threading Locks?
  • Multithread-Web-Server in Python
  • Multithreading mit Python und C api
  • Python3 Webserver kommunizieren zwischen Threads für IRC bot
  • PyGTK Multiprocessing und Updating GUI
  • Python ist die beste Programmiersprache der Welt.