実現したいこと
Pythonでmain処理が書いているmain.pyファイルで外部ライブラリを実行中、Ctrl+Cでmain.pyのexceptで処理できるようにしたいです。
ただし、外部ライブラリは変更せずmain.pyのみで対処したいです。
発生している問題・分からないこと
pytorchを使ってAIモデルを学習している際に、pytorchの外部ライブラリを参照しに行きます。
その際にCtrl+Cを実行すると
(略) KeyboardInterrupt
となってしまい、Ctrl+Cの入力は認識していますがコマンドプロンプトが固まってしまいます。
この問題をtyr exceptで囲んでいるmain.pyファイルで正常に処理したいです。
エラーが確認されているソースコード
pytorch github
上記URLの131行目、class DataLoaderを使っているときにエラーが発生します。
(追記)
上記DataLoaderを読み込むとき、
python
1trainloader = torch.utils.data.DataLoader( 2 train_dataset, 3 batch_size=batch_size, 4 shuffle=config.TRAIN.SHUFFLE and train_sampler is None, 5 num_workers=config.WORKERS, 6 pin_memory=True, 7 drop_last=True, 8 sampler=train_sampler)
のように書きますが、num_workersが0のときは正常にexcept KeyboardInterruptできます。
num_workersを2より大きくすると、コマンドプロンプトが固まります。
num_workersの値分、バッチ処理が裏に走るようで複数バッチ処理が走っている場合にctrl+Cをするとすべてのバッチ処理を止めることができず、フリーズするようです。
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
- signalを使ってCtrl+Cの入力を拒否しようとしてもclass DataLoaderを参照中はCtrl+Cの入力を認識しており、コマンドプロンプトが固まる
→signal.signal(signal.SIGINT, signal.SIG_IGN)
◯自分の見解
- 参照しているclass DataLoaderはmultiprocessingが走っておりmain.pyとは別のプロセスが走っていることが原因だと考えている。
signal.signal(signal.SIGINT, signal.SIG_IGN)した場合、メインとなるプロセスのCtrl+Cは無視することができてもmultiprocessingのサブプロセスは無視することができないと思っている。
ただ、外部ライブラリのファイルを変更せずにmain.pyからの処理だけで正常に処理する方法が分からず苦戦している。
補足
- 業務PC
→Windows11/python 3.13.2/cmd.exe/PyTorch 2.5/CUDA version 11.8/num_workers 2~4で検証
- 自宅PC
→Windows11/python 3.12.9/cmd.exe/PyTorch 2.5/CUDA version 12.6/num_workers 2~4で検証
