概要

前回のつづきだ。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 をどうぞ。

 

Effective Python 感想文一覧