67075


python でマルチスレッドを勉強中です

以下のようなクリティカルセッションでカウンタを増やすだけのプログラムを書いたのですが  
LOCKを入れた途端デッドロックしてるのか何も表示されなくなります

[code]

    import concurrent.futures
    import time
    import threading
    LOCK = threading.Lock()
    
    count = 0
    
    def func1():
      with LOCK:   # この行がなければ動く
        count += 1
      print(count)
    
    
    if __name__ == "__main__":
      executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)
      while True:
        executor.submit(func1)
        time.sleep(1)
    
[/code]

[code]

    LOCK.acquire(blocking=True)
      count += 1
      LOCK.release()
    
[/code]

と書いても同じです  
count += 1  
は絶対脱出するはずなのでデッドロックは起きようがないと思うんですが  
C の pthread_mutex_lock のようなものではないんでしょうか


CC BY-SA 4.0
2020-05-28T08:46:12.953
67074
2020-05-28T09:29:17.410
question
python
python マルチスレッドで共有変数の更新方法


グローバル変数宣言をしていないため、実行時に`UnboundLocalError`が起こっていることが原因です。

次のように修正してみてください。

[code]

    def func1():
        global count
        with LOCK:
            count += 1
        print(count)
    
[/code]

ランタイムエラーを見るには`Future`の`result()`メソッドや`exeception()`メソッドを使うと良いようです。

[code]

    executor.submit(func1).add_done_callback(lambda f: print(f.exception()))
    
[/code]


CC BY-SA 4.0
2020-05-28T09:29:17.410
67075
2020-05-28T09:29:17.410
13199
67074
answer