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 .

  • Tkinter 'Bindung' mit 'Leinwand' und Threading ValueError
  • Trainiere zwei Modelle gleichzeitig
  • Python 3.2 globale Variable nicht aktualisiert, wenn seine in einem Thread
  • Eine Programmierstrategie zur Umgehung des os Thread Limits?
  • Sellerie: Wie kann man die Anzahl der Aufgaben in der Warteschlange begrenzen und die Fütterung beenden?
  • In Python, wie weiß ich, wann ein Prozess beendet ist?
  • Warum ist nicht numpy.mean multithreaded?
  • Wie kann ich ein Multithread-Programm in Python profilieren?
  • Python Multi-Threading langsamer als seriell?
  • Python, wie man Threads, die in der Warteschlange mit Signalen blockiert sind, tötet?
  • Python / OpenCV-Anwendungssperrproblem
  • Python ist die beste Programmiersprache der Welt.