廖雪峰python学習ノート【16】プロセスとスレッド:マルチプロセス、マルチスレッド


一、マルチプロセス
1.forkが2回返す理由:forkを呼び出すと、オペレーティングシステムは現在のプロセスをコピーし、forkは親子プロセスでそれぞれ1回返します.
2.pythonのosモジュール内のforkはlinuxクラスシステムでのみ呼び出されます.
    2.1 import os
    2.2 pid = os.fork()#pidはサブプロセスで0です.親プロセスでサブプロセスのプロセスidです.
3.multiprocessingモジュール
3.1 multiprocessingは、プラットフォームバージョンにまたがるマルチプロセスモジュールです.
3.2サブプロセスの作成例:
        
from multiprocessing import Process #  multiprocessing    Process 。
pid = Process(target = childFunc, args = ('test', )) #     Process  ,           。target           ;args     。
pid.start() #        。
pid.join() #        。          。

3.3プロセスプールからサブプロセスを作成する例:
from multiprocessing import Pool #  multiprocessing    Pool 。
pids = Pool(4) #               
for loop in range(4);
    pids.apply_async(childFunc, args = (loop, ))
    pids.close() #   join()      close()。
    pids.join() #            。

4.subprocessモジュール
4.1 linux上のsystem()システム呼び出しと同様です.
5.プロセス間通信
5.1 multiprocessingモジュールでは、QueueやPipesなど様々な方法でプロセス間通信をサポートしています.
5.2 Queueのput()メソッドでキューにデータを書く.get()メソッドでキュー内のデータを読み出します.
二、マルチスレッド.
1.python標準ライブラリには、2つのスレッドモジュールがあります:threadとthreading._threadは低級モジュールである.threadingは高度なモジュールで、カプセル化されています.threadモジュール;一般的にthreadingモジュールが使用されます.
2.スレッドを開始することは、Threadクラスのインスタンスを作成し、インスタンスのstart()メソッドを呼び出して実行を開始することです.例:
    
import threading
td = threading.Thread(target = threadFunc, name = 'testThread', args = (4, ))
td.start()

3.threadingモジュールのcurrent_thread()メソッドは、現在のスレッドのインスタンスを返すために使用されます.threading.current_thread().nameは現在のスレッドの名前です.
4. Lock
4.1注意:上級言語の1つの文はCPU実行時にいくつかの文である.
4.2グローバル変数はマルチスレッド間で共有されており、変数を変更する前にロックが必要です.例:
        
lock = threading.Lock() #   Lock    
lock.acquire() #    
try:
    do something
finally:
    lock.release()

5.マルチコアCPU:
5.1 GILロック:Global Interpreter Lockグローバルインタプリタロック.
5.2プロセスごとにGILロックがあります.
5.3公式CPython解釈器はpythonスレッドを実行する前にまずGILロックを取得し、100バイトコードを実行した後にGILロックを解放し、他のスレッドはロックを取得した後に順次実行する必要がある.したがってpythonスレッドは本当にマルチコアを利用することはできません.
5.4 python本当にマルチコアを利用するにはプロセスしか使用できません.
三、ThreadLocal
1.使用法:グローバル変数としてthreadingモジュールのlocalクラスのインスタンスを作成します.
2.ThreadLocal変数はグローバル変数ですが、各スレッドは独自のスレッドの独立コピーのみを読み書きできます.
四、プロセスvsスレッド
1.マルチプロセスの利点:比較的安定性が高く、サブプロセスの異常は親プロセスまたは他のサブプロセスに影響しません.
2.マルチプロセスの欠点:作成プロセスのオーバーヘッドが大きい.
3.計算密集型vs IO密集型
3.1計算密集型:CPU資源を消費する.タスク数が多ければ多いほど、タスク切替によるCPU消費が大きくなるため、推奨タスク数はCPUコア数である.C言語で書くことをお勧めします.
3.2 IO密集型:CPU資源の消耗が少なく、IOの消耗時間が長いため、任務数が比較的に多く、CPUの利用率が高い;Pythonなどの開発効率の高い言語を使用するのに適しています.
4.非同期IO:
4.1をイベント駆動モデルと呼ぶ.単一プロセスの単一スレッドモデルは、マルチタスクもサポートします.
4.2 Nginxは非同期IOをサポートするwebサーバです.
4.3 Python言語の非同期プログラミングモデルを協程と呼ぶ.
五、分布式プロセス
1.multiprocessingモジュールはマルチプロセスをサポートするだけでなく、そのサブモジュールmanagersはマルチプロセスをマルチステートマシンに分散することもサポートする.
2.Queueの役割は、タスクの伝達と受信結果であり、各タスクの記述データ量はできるだけ小さくしなければならない.