2

特定の機会に新しいアイテムを取得するpythonプログラムにリストがあります(これはメッセージキューコンシューマーです)。次に、リストに何かがあるかどうかを数分ごとにチェックするスレッドがあり、ある場合は、各項目に対してアクションを実行してからリストを空にしたいと考えています。

今私の問題: サブスレッドのアクションがアトミックであることを確認するためにロックを使用する必要がありますか?これにより、リストを調べている間、メインスレッドがリストを変更できないことが保証されますか?
または、代わりに何らかのフラグを使用する必要がありますか?

私の問題をより明確にするための疑似コード。

サブスレッド:

def run(self):
    while 1:
        if get_main_thread_list() is not empty:
            do_operations()
        empty_the_list()
        sleep(30)

メインスレッド:

list = []

def on_event(item):
    list.add(item)

def main():
    start_thread()
    start_listening_to_events()

これで私の問題が明確になることを願っています。リソースやコメントへのリンクは大歓迎です!

PS: 私は、この質問に対してスレッド化プログラミングを十分に理解していない可能性があることを十分に認識しています.

4

1 に答える 1

4

サブスレッドのアクションがアトミックであることを確認するためにロックを使用する必要がありますか?これにより、リストを調べている間、メインスレッドがリストを変更できないことが保証されますか?

はい。正しく実装すれば、はい。

または、代わりに何らかのフラグを使用する必要がありますか?

「ある種のフラグ」==ロックなので、スレッドロックを使用することをお勧めします。

重要:queue stdlib からモジュール を再実装しようとしているように見えます。確認してみてください。

興味深い機能がたくさんあるだけでなく、スレッドセーフでもあります。

このqueueモジュールは、マルチ プロデューサー、マルチ コンシューマー キューを実装します。複数のスレッド間で情報を安全に交換する必要があるスレッド化プログラミングで特に役立ちます。このモジュールのQueueクラスは、必要なすべてのロック セマンティクスを実装します。

于 2012-08-07T10:08:51.380 に答える