Python実践入門 10章 並行処理
逐次処理、並行処理、並列処理の違い
タスクA, B, Cがあり各タスクには3つの子タスクがあるとする
タスクA-1, A-2, A-3, B-1, B-2, B-3..のように1つのタスクを終わらせてから次のタスクに移るもの
Pythonでの基本処理はこれ
タスクA-1, C-1, B-1, A-2, B-2, C-2..のように一人で複数のタスクを同時に少しずつ処理していく
Pythonではマルチスレッドを利用するとこれになる
タスクを処理する人を増やして
ユーザー1はタスクA-1, A-2..
ユーザー2はタスクB-1, B-2..
のように処理していく
Pythondはマルチコア・マルチプロセスを利用した場合の処理
並列処理は並行処理に包含される
マルチスレッドかマルチプロセスか?
処理内容によって決めるべき、CPUバウンド(計算負荷の重い処理か)なのか、I/Oバウンド(ネットワークやディスク書き込みなど待ち時間のあるものか)なのかで決めるべき
PythonはGIL(Global Interpreter Lock)の仕組みがあるせいで、CPUバウンド系の処理でマルチスレッド処理は意味がない
concurrent.futuresモジュール
future_obj = ThreadPoolExecutor().submit(func)でfuture object生成
マルチスレッド->並行処理が実現できる
マルチスレッドプログラミングではスレッドセーフな処理を意識して行おう(スレッド間で共有するデータとか)
ProcessPoolExecutorはマルチプロセス処理
CPUバウンド系はこっち使おうね
マルチプロセスはプロセスかんのデータ受け渡し気をつけよう
multiprocessing.Queueクラスで実現されるキューを利用してプロセス間のデータ受け渡しを実現する
ここにはpickleという形式にシリアライズされたオブジェクトしか入れれない(pickle化できないのは無理) asyncioモジュール
イベントループを利用した並行処理のための、標準ライブラリ
シングルスレッドでも並行処理を実現できる
コードも同期処理っぽくかけて可読性維持がしやすい
コルーチンの概念を持つ
1連の処理をまとめたもの、が処理の途中で中断・再開が可能
関数の宣言の前にasyncをつけるとコルーチンオブジェクトを返す関数になる
コルーチンで結果が帰るまで待つにはawaitを使う
イベントループ、タスク