Synchronisieren von mehreren Threads in Python
-
23-08-2019 - |
Frage
Ich habe ein Problem, wo ich x
Threads müssen warten, bis sie alle haben einen Synchronisationspunkt erreicht. Meine Lösung verwendet die synchronise
Verfahren unten, die von jeder Gewinde Funktion wird aufgerufen, wenn sie synchronisiert werden müssen.
Gibt es einen besseren Weg, dies zu tun?
thread_count = 0
semaphore = threading.Semaphore()
event = threading.Event()
def synchronise(count):
""" All calls to this method will block until the last (count) call is made """
with semaphore:
thread_count += 1
if thread_count == count:
event.set()
event.wait()
def threaded_function():
# Do something
# Block until 4 threads have reached this point
synchronise(4)
# Continue doing something else
Lösung
Es gibt viele Möglichkeiten, um Threads zu synchronisieren. Viele.
Zusätzlich zu synchronisieren, können Sie wie die folgenden Dinge tun.
-
Brechen Sie Ihre Aufgaben in zwei Schritten um den Synchronisationspunkt. Starten Sie Threads den Prä-Sync-Schritt zu tun. Dann verwenden Sie „join“ zu warten, bis alle Threads Schritt 1. Starten Sie neue Themen zu tun, den Post-Sync Schritt beenden. Ich ziehe diese über synchronisieren.
-
eine Warteschlange erstellen; eine Synchronisationssperre erwerben. Starten Sie alle Threads. Jeder Thread legt einen Eintrag in der Warteschlange und wartet auf die Synchronisationssperre. Das „Haupt“ Gewinde sitzt in einer Schleife Elemente aus der Warteschlange Warteschlangenauflösungs. Wenn alle Threads auf ein Element in der Warteschlange zugewiesen sind, gibt der „Haupt“ Thread den Synchronisations-Sperre. Alle anderen Threads sind jetzt wieder frei laufen zu lassen.
Es gibt eine Reihe von Interprozesskommunikation (IPC) Techniken -. Alle für die Thread-Synchronisation verwendet werden kann
Andere Tipps
Die Funktionalität von Ihnen gewünschten ein namens " Barriere ". (Leider dieser Begriff hat zwei Bedeutungen, wenn sie über Einfädeln zu sprechen. Wenn Sie also ein href <= "http://www.google.com/search?hl=en&client=firefox-a&rls=org.mozilla%3Aen-GB%3Aofficial&hs= dq4 & q = Barriere + threading + python & BTNG = Search "rel = "nofollow noreferrer"> Google es, nur Artikel ignorieren, die darüber reden, " Speicher Barrieren .“- das ist eine ganz andere Sache)
Ihr Code sieht durchaus sinnvoll - es ist einfach und sicher
.Ich konnte keine „Standard“ Implementierungen von Barrieren für Python finden, so schlage ich vor, Sie Ihren Code weiterverwenden.
Hinweis hat, dass Barrier implementiert wie von Python 3.2
Beispiel für die Verwendung Barrieren:
from threading import Barrier, Thread
def get_votes(site):
ballots = conduct_election(site)
all_polls_closed.wait() # do not count until all polls are closed
totals = summarize(ballots)
publish(site, totals)
all_polls_closed = Barrier(len(sites))
for site in sites:
Thread(target=get_votes, args=(site,)).start()