92014


**OS** : Windows 10

１度しか`threading.Thread()`を実行していないにもかかわらず，このThreadインスタンスのname属性をみると，`Thread-3`でした．多くのモジュールをインポートしているので，そのどこかでスレッドを作っているのではないかと推測しています．

`threading.enumerate()`により，アクティブなスレッドを調べてみましたが，`MainThread`と`Thread-3`のみでした．

そこで，スレッド名が`Thread-3`となった原因を調べたいです．  
そのために，終了したスレッドを含めた合計を知る方法，もしくはスレッドが生成されたタイミングを検出する方法が知りたいのです．（pythonでない他のツールを用いた方法でも構いません．）  
そのような方法はありますでしょうか？


CC BY-SA 4.0
2022-11-04T11:46:59.853
91996
2022-11-06T00:50:13.317
2022-11-04T12:01:05.023
50560
50560
question
python python3 マルチスレッド
threading.Thread()で生成されたスレッドの合計（終了済み含む）を調べる方法はありますか？


「スレッドが生成されたタイミングを検出する方法」についてです。  
threading.Threadとその派生クラスのインスタンス生成を知りたいのであれば、threading.Thread.__init__にブレークポイントを張ればいいのではないでしょうか？

例えば以下のようなPythonスレッドを使うコードがあったとして

[code]

    import concurrent.futures
    import threading
    
    def print_thread(id):
        hogename = threading.current_thread().name
        print(f'started: {id} {hogename}')
    
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        futures = {executor.submit(print_thread, id): id for id in range(10)}
        for future in concurrent.futures.as_completed(futures):
            print(f'finished: {futures[future]}')
    
[/code]

使いにくいものの環境を問わないデバッガのpdbを使ってbreak pointを張るとすると、、、

[code]

    C:\Users\user\python>python -m pdb hoge.py
    > c:\users\user\python\hoge.py(1)<module>()
    -> import concurrent.futures
    (Pdb) n
    > c:\users\user\python\hoge.py(2)<module>()
    -> import threading
    (Pdb) n
    > c:\users\user\python\hoge.py(4)<module>()
    -> def print_thread(id):
    (Pdb) b threading.Thread.__init__
    Breakpoint 1 at c:\python38\lib\threading.py:761
    (Pdb) c
    > c:\python38\lib\threading.py(784)__init__()
    -> assert group is None, "group argument must be None for now"
    (Pdb)
    
[/code]

こんな感じに止まります。


CC BY-SA 4.0
2022-11-04T16:28:39.310
92002
2022-11-04T16:28:39.310
54957
91996
answer


>
> １度しかthreading.Thread()を実行していないにもかかわらず，このThreadインスタンスのname属性をみると，Thread-3でした．多くのモジュールをインポートしているので，そのどこかでスレッドを作っているのではないかと推測しています．

実行環境は何でしょうか？  
threadingモジュールしかimportしていなくても、  
jupyter notebookやspyderで実行したとき、スレッドは`Thread-1`から始まりませんでした。  
pythonコマンドやIDLE、Pycharmではスレッドが`Thread-1`から始まります。

<https://docs.python.org/ja/3.10/library/threading.html>  
によると

[code]

    name
      識別のためにのみ用いられる文字列です。
      名前には機能上の意味づけ (semantics) はありません。
      複数のスレッドに同じ名前をつけてもかまいません。
      名前の初期値はコンストラクタで設定されます。
    
[/code]

とあります。  
スレッドの名前はあまり気にしなくてもよいと思います。

* * *

> threading.Thread()で生成されたスレッドの合計（終了済み含む）を調べる方法はありますか？

[trace --- Python
文実行のトレースと追跡](https://docs.python.org/ja/3.10/library/trace.html)  
[trace – 実行された通りに Python
コードを追跡する](https://docs.python.org/ja/3.10/library/trace.html)

実行トレースが取れるようです。

[code]

    python3 -m trace --trackcall 実行する.pyファイル
    
[/code]

どのモジュールから`threading.Thread.start`が呼び出されたかがわかります。

[code]

    python3 -m trace --trace --timing 実行する.pyファイル
    
    
[/code]

どのモジュールのどのコードから`threading.Thread.start`が呼び出されたかがわかります。出力される行数は多いです。


CC BY-SA 4.0
2022-11-05T10:13:24.073
92014
2022-11-06T00:50:13.317
2022-11-06T00:50:13.317
35558
35558
91996
answer