71603


**問題**  
threadingを使用して0から50を足すプログラムを2つ立ててその合計値を監視する関数で100%になるまで監視しています。for文でそれぞれのスレッドに`join()`を付与しているため1~50足されるまで次のスレッドに処理が移らず同期処理を行っています。今はスレッドを作成する`range(2)`と２つしか立ててないので別々で作成して`start()`を先に実行してから`join()`を付与する方法もありますが、`range(100)`になった場合でも対応できるコードを書くにはどのようにしたら良いでしょうか？

[code]

    import time
    import threading
    import sys
    
    class AddingNumber():
        def __init__(self):
            self.sum = 0
            self.flag = True
        
        def adding(self, number):
            for i in range(number):
                time.sleep(.1)
                self.sum += 1
        
        def progress(self):
            while self.flag:
                sys.stdout.write('  {percent}%\r'.format(percent=self.sum))
                
    
    calculation = AddingNumber()
    
    t2 = threading.Thread(target=calculation.progress)
    t2.setDaemon(True) 
    t2.start()
    
    for i in range(2):
        t = threading.Thread(target=calculation.adding, args=[50])
        t.start()
        t.join()
    
    calculation.flag = False
    
    
    
    print('{percent}%\r'.format(percent=calculation.sum))
    
[/code]


CC BY-SA 4.0
2020-10-29T13:08:36.890
71599
2020-10-29T18:36:43.423
22565
question
python python3 非同期
スレッドで書いたプログラムが非同期処理にならない。


こちらの記事の：  
[Pythonで並列化を学んでみる(マルチスレッド偏)](https://qiita.com/__init__/items/74b36eba31ccbc0364ed)  
ここの部分が参考になるでしょう。  
[■スレッドの一覧](https://qiita.com/__init__/items/74b36eba31ccbc0364ed#%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%AE%E4%B8%80%E8%A6%A7)

あるいはこちらの記事の：  
[Pythonの並列処理・並行処理をしっかり調べてみた](https://qiita.com/simonritchie/items/1ce3914eb5444d2157ac)  
ここの部分も同様ですね。  
[threadingのコードサンプル](https://qiita.com/simonritchie/items/1ce3914eb5444d2157ac#threading%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)

いずれも`for`ループで作って開始したスレッドオブジェクトをリストに追加しておいて、すべて開始してから次の`for`ループでそれぞれのスレッドの終了待ちを行う形です。

質問のプログラムに適用すると以下のようになるでしょう。

[code]

    threads = []
    
    for i in range(2):
        t = threading.Thread(target=calculation.adding, args=[50])
        t.start()
        threads.append(t)
    
    for t in threads:
        t.join()
    
    calculation.flag = False
    
[/code]

2つ目の記事では、その後にもう一つ別の仕組みが紹介されています。  
[concurrent.future（並行処理）のコードサンプル](https://qiita.com/simonritchie/items/1ce3914eb5444d2157ac#concurrentfuture%E4%B8%A6%E8%A1%8C%E5%87%A6%E7%90%86%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)

似たような考え方ですが、最大スレッド数が指定出来るようになっていて、それを超える数の処理が起動されるように指示されたら、残りは処理待ち状態となり、あるスレッドの処理が終了したら待ち状態の中から次の処理を取ってきてこなしていく形になるようです。

* * *

その辺も含めてスレッド間の連携・通信や排他制御といったことも書いてある記事がこちら。  
[Pythonのthreadingとmultiprocessingを完全理解](https://qiita.com/kaitolucifer/items/e4ace07bd8e112388c75)


CC BY-SA 4.0
2020-10-29T15:48:08.127
71603
2020-10-29T15:48:08.127
26370
71599
answer