Python のマルチスレッドでクラス変数を変更する方法

Pythonでは、クラス変数を変更するにはクラス名でアクセスして変更します。また、マルチスレッド時で、複数のスレッドが同一のクラス変数を変更する場合は、スレッドセーフにするためのロックが必要です。

以下は、クラス変数を変更するサンプルコードです。

import threading

class MyClass:
    count = 0

    @classmethod
    def increment(cls):
        with threading.Lock():
            cls.count += 1

# 创建多个线程来同时修改类变量
threads = []
for _ in range(10):
    thread = threading.Thread(target=MyClass.increment)
    threads.append(thread)
    thread.start()

# 等待所有线程执行完毕
for thread in threads:
    thread.join()

# 打印最终结果
print(MyClass.count)

上記コードでは、クラス変数countを定義し、その値を増やすクラスメソッドincrementを定義しました。incrementメソッドでは、threading.Lock()でスレッドロックを作成し、countに同時にアクセスして変更が行われないようにしています。その後、MyClass.incrementメソッドを同時に呼び出す10個のスレッドを作成し、countの最終結果を出力しています。

スレッドロックを使うことでスレッドセーフにすることができますが、ロック競合によるパフォーマンス低下の問題も発生するので、マルチスレッドでクラス変数を変更する場合はロックの必要性とパフォーマンスへの影響を考慮する必要があります。

bannerAds