質問

必要な場所に問題があります 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
役に立ちましたか?

解決

スレッドを同期するにはさまざまな方法があります。多くの。

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

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

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

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

他のヒント

必要な機能は「」と呼ばれます。バリア」。(残念ながら、スレッドについて話すとき、この用語には 2 つの意味があります。それで、あなたが グーグル それについて語る記事は無視してください。」記憶の壁「 - それはまったく違うことです)。

あなたのコードは非常に合理的で、シンプルで安全です。

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

そのバリアは、Python 3.2 にが実装されているメモP> 障壁を使用する

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()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top