
みなさん、こんにちは。
前回は、YAML、ファイル操作、JSON処理といった、ネットワーク自動化を支える基礎的なスキルに焦点を当てた模擬問題を取り上げました。これらは地味に見えるものの、設定管理やログ解析、API連携といった自動化の土台となる重要な要素でした。
今回は、複数のネットワーク機器を効率よく処理するための「並列処理」をテーマにしましょう。ネットワーク自動化の現場では、対象機器が1台だけということはほとんどありません。10台、50台、100台といった機器に対して、同じ処理を一斉に行う場面が多く、その際に処理時間をどう短縮するかが重要な課題になります。
Pythonでは、外部ライブラリに頼らずとも、標準ライブラリに含まれる threading や concurrent.futures を利用することで、I/O待ちの多い処理(SSH接続やAPI通信など)を効率よく並列化できます。これらは追加インストールが不要で、環境を選ばずに使える点も、現場での自動化において大きなメリットです。
今回は、それらにまつわる模擬問題です。
【問題1】複数機器へのSSH処理を並列実行する方法
複数のネットワーク機器にSSH接続し、同じ処理を並列で実行したい。I/O待ちが中心の処理に適した書き方として、最も適切なものはどれか。
選択肢:
A.
| for device in devices: process_device(device) |
B.
| import threading for device in devices: t = threading.Thread(target=process_device, args=(device,)) t.start() |
C.
| from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=5) as executor: executor.map(process_device, devices) |
D.
| import multiprocessing with multiprocessing.Pool() as p: p.map(process_device, devices) |
正解:
C
解説:
ネットワーク機器への接続処理は、CPU計算よりも「待ち時間(I/O)」が支配的です。そのため、ThreadPoolExecutorを使ったスレッド並列が適しています。
A は単なる逐次処理で、台数が増えるほど時間がかかります。
B は動作しますが、スレッド管理や終了待ちが煩雑になりがちです。
D はCPUバウンド向けで、プロセス起動コストが大きくなってしまいます。
concurrent.futures.ThreadPoolExecutor は、シンプルで安全に並列処理を書けるため、実務でもよく使われます。
【問題2】並列処理でよくある落とし穴
ThreadPoolExecutor を使った並列処理で注意すべき点として、最も適切なものはどれか。
選択肢:
A. スレッド数は可能な限り多く設定した方がよい
B. 例外は自動的に無視されるので、特に気にする必要はない
C. 共有リソース(ファイルや変数)には注意が必要
D. 並列処理は必ず処理結果の順序を保証する
正解:
C
解説:
並列処理では、複数のスレッドが同時に同じリソースへアクセスする可能性があります。
- ログファイルへの同時書き込み
- グローバル変数の更新
- データベース接続の共有
といった点は、意図しない競合や不整合の原因になります。
A は誤りで、スレッド数が多すぎると逆に性能が低下します。
B は誤りで、例外は Future 経由で取得・処理すべきです。
D も誤りで、並列処理では実行順序は保証されません。
【問題3】処理結果を安全に回収する方法
ThreadPoolExecutor を使って並列処理を行い、処理結果や例外を個別に確認したい。その目的に最も適した書き方はどれか。
選択肢:
A.
| executor.map(process_device, devices) |
B.
| futures = [] for d in devices: futures.append(executor.submit(process_device, d)) |
C.
| for f in futures: print(f) |
D.
| for future in futures: print(future.result()) |
正解:
D
解説:
submit() で返される Future オブジェクト を使うと、
- 正常終了時の戻り値
- 発生した例外
を future.result() で安全に取得できます。
A は結果や例外を個別に扱えません。
B は Future を集めるだけで、結果取得が不足しています。
C は Future オブジェクト自体を表示しているだけです。
実務では、処理に失敗した機器だけを再試行する、といった制御にも Future が役立ちます。
まとめ
今回は、ネットワーク自動化を目指して、複数機器への並列処理をテーマにした基礎的な模擬問題を出力しました。
- ThreadPoolExecutor によるシンプルな並列処理
- 並列化における注意点(共有リソース・例外処理)
- Future を使った安全な結果回収
これらを押さえておくと、対象機器が増えた場合でもスムーズに対応できる自動化スクリプトを書けるようになります。単一の機器だけを想定したスクリプトから、複数機器を前提としたネットワーク自動化へと発展させることができます。
次回は、テンプレートによる設定生成や、設定投入を伴う自動化の考え方といったテーマを扱う予定です。どうぞお楽しみに。





