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
War es hilfreich?

Lösung

Es gibt viele Möglichkeiten, um Threads zu synchronisieren. Viele.

Zusätzlich zu synchronisieren, können Sie wie die folgenden Dinge tun.

  1. 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.

  2. 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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top