Titleに並行処理と書きましたが、必ずしも私の誤解が並行処理に特有のところななのかは定かではありません。
Python実践入門という本の並行処理のところで以下のようなコードが出てきます。
python
1import threading 2class ThreadSafeCounter: 3 # ロックを用意する 4 lock = threading.Lock() 5 def __init__(self): 6 self.count = 0 7 def increment(self): 8 with self.lock: 9 # 排他制御したい一連の処理をこのブロック内に書く 10 self.count = self.count + 1 11 12 13def count_up(counter): 14 # 1,000,000回インクリメントする 15 for _ in range(1000000): 16 counter.increment() 17 18 19counter = ThreadSafeCounter() 20threads = 2 21with ThreadPoolExecutor() as e: 22 futures = [e.submit(count_up, counter) 23 for _ in range(threads)] 24 done, not_done = wait(futures) 25 26 27# 期待通りの値になっている 28print(counter.count) 29>>> 2000000
このincrement
メソッドのwith self.lock
のところですが、クラス変数であるはずのlock
がなぜインスタンス変数のように呼び出されているんでしょうか?また、なぜそれでうまくいってるのでしょうか?
個人的には
python
1 2class ThreadSafeCounter: 3 def __init__(self): 4 self.count = 0 5 self.lock = threading.Lock() 6 def increment(self): 7 with self.lock: 8 # 排他制御したい一連の処理をこのブロック内に書く 9 self.count = self.count + 1
のような気がするのですが、何か誤解ありましたら教えていただけますと幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。