6

xスレッドがすべて同期ポイントに到達するまで待機する必要があるという問題があります。私のソリューションでは、synchronise同期が必要なときに各スレッド関数によって呼び出される以下のメソッドを使用します。

これを行うためのより良い方法はありますか?

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
4

3 に答える 3

2

必要な機能は「バリア」と呼ばれます。(残念ながら、この用語はスレッド化について2つの意味を持っています。したがって、Googleで検索する場合は、「メモリバリア」について説明している記事は無視してください。これはまったく別のことです)。

あなたのコードは非常に合理的に見えます-それはシンプルで安全です。

Pythonのバリアの「標準」実装が見つからなかったので、コードを使い続けることをお勧めします。

于 2009-05-20T11:40:53.163 に答える
2

スレッドを同期する方法はたくさんあります。たくさんの。

同期に加えて、次のようなことができます。

  1. タスクを同期ポイントを中心に2つのステップに分割します。事前同期ステップを実行してスレッドを開始します。次に、「join」を使用して、すべてのスレッドがステップ1を完了するまで待機します。同期後のステップを実行して新しいスレッドを開始します。私は同期よりもこれを好みます。

  2. キューを作成します。同期ロックを取得します。すべてのスレッドを開始します。各スレッドはエントリをキューに入れ、同期ロックを待ちます。「メイン」スレッドは、キューからアイテムをデキューするループ内にあります。すべてのスレッドがアイテムをキューに入れると、「メイン」スレッドは同期ロックを解放します。これで、他のすべてのスレッドが再び自由に実行できるようになります。

プロセス間通信(IPC)の手法は多数あり、そのすべてをスレッドの同期に使用できます。

于 2009-05-20T12:05:05.050 に答える
2

バリアはPython3.2以降で実装されていることに注意してください

バリアの使用例:

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()
于 2014-08-29T00:17:02.700 に答える