概要
前回のつづきだ。5章の楽しめたところノートを書く。
楽しめたところノート
並行性と並列性って何
- 並行: 複数のプログラムをちょっとずつ進めることで、同時に実行されているという印象を与えるセコいやり方。(個人の感想です)
- 並列: 複数のプログラムを、複数の CPU を使ってマジに同時に実行すること。
並行実行は別に速くならないが、並列は速くなるというのがポイント。
Python で並列実行
subprocess モジュールを使って子プロセスを作ることで並列実行ができる。そしてその入出力を管理することもできる。
Python のマルチスレッドは並列実行ではない
他の言語で「マルチスレッド」っていうと並列実行を意味するんだけれど、 Python では意味しない。 Python には GIL(global interpreter lock)なる機能があって、1スレッドだけを使うことを強制してくる。
は、クソ機能やん? と思うんだけれど、(よくわかんないが)スレッド間の公平性を保証してくれるらしい。関連して、メモリ管理や C 言語ライブラリとの連携を容易にするメリットがあるらしい……。
Python のスレッドの大問題
- スレッド同士が安全に協調するため特別なツールが必要になってしまう。
- 相互排他ロックのために threading モジュール、 Lock クラスが必要。
- ビジーウェイト、作業停止、メモリ爆発を防ぐために、 queue モジュールの Queue クラスが必要。
- これらを追加しているうちにコードは理解困難となり、拡張と保守を困難にする。
- 1つ実行するために8MBなんつー多量のメモリが必要になってしまう。
- 開始するとき時間がかかる。
スレッド、ダメやん。
以上の問題はコルーチンを使い回避できる
ジェネレータの拡張であるコルーチンなる機能を使うと、スレッドと同じようなことをやりつつも↑のような問題を回避できるそうな。わかりやすいところでいえば、1つ実行するときのメモリ消費は1KB以下になるらしい。
「本当の並列性」のための concurrent.futures モジュール
実際のとこ multiprocessing モジュールが並列をやらせてくれるそうなんだけど、このモジュールはちっと複雑すぎるらしい。その点 concurrent.futures の ProcesPoolExecutor クラスはシンプルにその機能を使えるのでオススメ! とのこと。
小休憩
えっと、短くまとめるとこんな感じ↓かな?
- 並列実行したいのが Linux コマンドみたいなやつだったら subprocess モジュールを使えばいいよ。
- 並列実行したいのが Python コードなんだったら concurrent.futures モジュールを使えばいいよ。
- 並行実行したいんだったらコルーチンを使えばいいよ。
- 並行、並列実行のおともに threading, Lock や queue, Queue をどうぞ。