Pythonのプロセスとスレッド、コルーチン分析

著作権:浅い@著作権元の記事を許可なく複製することはできませんhttps://blog.csdn.net/xili2532/article/details/89882511

pythonのプロセス

派遣

伝統的なコンピュータのオペレーティングシステムでは、CPUスケジューリングの基本単位はプロセスです。その後、ユニバーサルオペレーティングシステムは、スレッドがCPUスケジューリングの基本単位、唯一のリソースの所有者の基本単位としてのプロセスで、スレッドの概念を導入しています。

パラレル

スレッドが導入されて以来、もともと同時プロセスは一つだけを持つことができ、今のプロセスは、複数のスレッドを並列に実行することができます同時効率を処理するための子プロセスが何度か改善されるまで初期のHTTPサーバの多くは、フォークと比べて、同時サーバスレッドによって解決されます。このすべてが低く、プロセスのコストで同時実行スレッドのおかげで達成することができます。

定義

プロセスは、コンピュータプログラムの実行です。すなわち、各タイムコードの実行、最初自体であるプロセスです。
プロセスがあります。準備ができて、ランニング、中断、死んだ、端部と、他の州(異なるオペレーティングシステムが同じではありません)。

プロパティ

1.各プログラム自体、何よりもまず、プロセス
2を実行し、各プロセスは、独自のアドレス空間、メモリ、データ・スタックや他のリソースを持っています。
3.オペレーティング・システム自体が自動的にすべてのプロセスを(コードは、ユーザーの干渉を必要としない)を管理し、これらのプロセスの合理的な配分のための時間を実行することができます。
4.プロセスが新しいプロセスを導出することにより、他のタスクを実行することができますが、各プロセスはように、独自のメモリまたはデータスタックとしています。
プロセス間通信は、プロセス間通信(IPC)メソッドを使用して、缶(およびメッセージングデータ)。

説明

1.異なる複数のプロセスがCPU上で実行することができ、非干渉
同一のCPU上に2を、自動的にオペレーティングシステムのタイムスライスによって割り当てられた複数のプロセス、実行することができ
3。リソースは、プロセス間で共有することができないので、プロセス間通信等、メッセージを受信し、データを送信する必要があります
4。知られているマルチプロセス、「平行」。

UNIX / Linuxのオペレーティング・システムはシステムコールfork()を提供し、それは非常に特別です。再び呼び出される通常の関数呼び出しは、返されたが、(フォーク)を2回返され、一度呼び出して、オペレーティング・システムが自動的にそれぞれ、その後、(親として知られている)現在のプロセス(サブプロセスと呼ばれる)のコピーを配置しますので、親と子が内部に返します。

子供は決して0を返していない、と子プロセスの親プロセスIDに戻りますこの理由は、親が子供の多くをフォークすることができ、そのことで、それぞれの子の親プロセスIDはプロセスを書き留めて、しかし子供はちょうど(getppidを呼び出す)親プロセスのIDを取得することができます

フォークなどの一般的なシステムコールのPythonのosモジュールパッケージは、簡単にPythonプログラムでは、子プロセスを作成することができます

print(f"开始的进程是{os.getpid()}")
pid = os.fork()

if pid == 0 :
    print(f"我是子进程{os.getpid()},我的父进程是{os.getppid()}")
else:
    print(f"我是父进程{os.getpid()},我创建了子进程是{pid}")

結果:

9443は、プロセスの始まりである
私は、親プロセス9443で、私はサブプロセスが9444で作成した
私は、子プロセス9444だった、私の親プロセスは9443であります

Pythonは、クロスプラットフォームであるので、上記のはあるので、そのことは、Linuxのウィンドウに(めったにWindowsで書かれていないが)ながら?それはありますマルチプロセッシングこのモジュールは、マルチプロセッシングモジュールが提供しますプロセスカテゴリプロセス・オブジェクトを表現するために、次の例では、子プロセスを開始することであり、それが終了するのを待ちます。


def run_child(name):
    print(f"子进程的名字是{name},进程的pid是{os.getpid()}")

if __name__ == "__main__":
    print(f"父进程是{os.getpid()}")
    p = Process(target=run_child, args=('test',))
    print('子进程即将开始')
    p.start()
    p.join()
    print("子进程即将结束")

結果:

9409は、親プロセスで
子プロセスが開始されようとしている
テストは、pidのプロセスが9410である子供の名前を
終わりに近づいて、子プロセス

Pythonのスレッド

定義

スレッドは、コードは、プロセス内で実行されます。
次のプロセスは、これらのスレッドとの間の主なプロセスでオペレーティングシステムリソース共有アプリケーションの複数のスレッドを実行することができます。
プロセスで複数のスレッドを起動するときに、各スレッドは順番に実行されます。今、オペレーティングシステム、また、他のスレッドの実行を待っていることを、スレッドのプリエンプションをサポートし、優先順位、信号などにより、スレッドを実行していることになることは、自分自身が最初に実行ハングします。
複数のスレッドを同時に実行することができるマルチスレッド、各スレッドが交互に短いランは、それが同時に同一の実行のように見えるように、マルチプロセスの実装は、迅速に複数のスレッドを切り替えることと同じであるが、オペレーティングシステムによって。もちろん、同時に真のマルチスレッド、マルチコアCPUを行うことが可能とされた必要があります。

使用

1スレッドを含むユーザー作成プログラムは、(各番組自体は、プロセスである)
現在のプロセスに2オペレーティングシステム「ハンドオーバ手順」
3.現在のプロセスがスレッド、スレッド開始含む
スレッド4は、複数の実行順序は押収しない限り、
また、「同時」実行として知られている5.マルチスレッド、。

プロパティ

1.スレッド、実行中の存在下でプロセスを起動する必要があり
、CPUなどのリソースがプロセスに適用する必要があるようではない、2スレッドは、プロセスを使用して得られたシステムリソース
3.スレッドが公正な実行時間を与えることはできません、それは他のスレッドによってプリエンプトすることができ、オペレーティングシステムの実行時間の分布に応じた処理を設定する
プロセスあたり4、あなたは多数のスレッドを開始することができます

複数のプロセスによって行うことができるマルチタスク、それはまたプロセス内の複数のスレッドによって行うことができます。また、プロセスは、複数のスレッドで構成され、方法は、少なくとも一つのスレッドを有しています。
スレッドが_threadのための高度なモジュールがカプセル化されている、_threadが下位モジュールで、_threadとスレッド:Pythonの標準ライブラリには、2つのモジュールを提供します。ほとんどの場合、我々は、この先進的なthreadingモジュールを使用する必要があります。

()関数に渡されたスレッドを起動して、スレッドのインスタンスを作成し、起動呼び出しを開始

# 新线程执行的代码:
def loop():
    print(f"子线程{threading.current_thread().name}正在执行")
    n = 0
    while n < 5:
        n = n + 1
        print(f"子线程{threading.current_thread().name}>>>{n}")
        time.sleep(1)
    print(f"子线程{threading.current_thread().name}结束了")

print(f"线程{threading.current_thread().name}正在运行啊")
t = threading.Thread(target=loop)
t.start()
t.join()
print(f"线程{threading.current_thread().name}结束")

結果:

ああMainThreadスレッド実行
子スレッドのスレッド1が実行され
、子スレッドをスレッド1 >>> 1
子スレッドスレッド1 >>> 2
子スレッドスレッド1 >>> 3
子スレッドスレッド1 >>> 4
サブスレッドスレッド-1 >>> 5
の子スレッドスレッド-1エンド
スレッド終了MainThread

デフォルトでは、すべてのプロセスは、スレッド、我々はメインスレッドと呼ばれるスレッドを起動し、メインスレッドと新しいスレッドを開始することができますので、Pythonのスレッドモジュールは常に現在のスレッドのインスタンスを返しますcurrent_thread()機能を有しています。名前はスレッド-1という名前のスレッド、スレッド-2に自動的にPythonの余裕がない場合MainThreadと呼ばれるメインスレッドインスタンスの名前は、子スレッドの名前は、作成時に指定されています。

プロセスとスレッドの違い

プロセス間のスレッド間で情報通信容易に互いに、共用の独立(工程において、共有メモリなど)と比較して、それぞれのスレッドとメイン処理の処理は、同一のリソースを共有します。

一般からこそ、この同時実行性とデータ共有メカニズムの同時実行スレッドは、可能な複数のタスク間のコラボレーションを可能にします。

並列プログラムは、CPUの複数で同時に実行することができる可能にほぼ平行実行処理、。

プロセス内で複数のスレッドを実行しているとは異なりだけで、プロセスはプログラムを実現することができます(共有、CPU内のプロセス、打ち上げ複数のスレッド、スレッドのスケジューリング、このプロセスの実行可能なタイムスライス)を「タイムスライス」に適用することができます「同時に」実行(複数のCPUが同時に実行されています)。

一般的なシナリオのプロセスとスレッド

一般的には、Pythonで書かれた並行プログラムの経験:

マルチプロセスを使用して計算集約的なタスク
、マルチスレッド、マルチプロセスはあまり使用用いたタスク:IO集中(ネットワーク通信など)を。
IOオペレーションのような排他的なリソースを必要とするからです。

ネットワーク通信だけが一人は話す(一人だけが、マイクロに話すように、マクロはおしゃべりしながらのように見える)
ファイルが1つのプログラムだけ操作が可能読み、同時に書き込み(同時に2つのプログラムがファイル'は同じに書き込まれている場合「」b」が、そのファイルがそれ最後に書かれているが?)
でもプリエンプション場合、マルチスレッド実行一つ一つのホスト・アプリケーション・プロセスによってリソースを複数のスレッドで使用されている1つのプログラムだけ、IOリソースを制御する必要があります、そして、一つの実行によって、同時に実行される「マルチスレッド」感じ。

複数のプロセスの場合、プロセスの終了、またはリソースの「無駄」に完全には明らかに、することはできません複数のプロセスでない限り。

問題:

我々は以前に書いた全てのPythonプログラムは、プロセスは、一つのスレッドだけである単一のタスクを実行することです。私たちは、同時に複数のタスクを実行したい場合はどのように行うには?
解決策は2つあります:
1つは、複数のプロセスを開始するために一つのスレッドだけが、各プロセスですが、プロセスの数が複数のタスクを実行することができます。
2.もう一つの方法は、複数のスレッドが、タスクの数を行うことができるように、プロセス内で複数のスレッドを起動するプロセスを開始することです。
もちろん3は、第三の方法は、複数のプロセス、各プロセスを開始し、次いで、なおさら、もちろん同時に実際、このモデルより複雑な実行タスクはめったに使用されない複数のスレッドを起動することです。

3つの方法で、マルチタスクはこれに沸きます:

マルチプロセス・モデル、
マルチスレッドモード、
マルチプロセス、マルチスレッドモード。

計算集約型IO集約型の対

マルチタスキング秒配慮を採用するかどうかは、タスクの種類です。私たちは、にタスクを置くことができますIO集約型および計算集約。

計算集約的なタスクは、ように、PI、高精細ビデオのデコードを計算し、計算など、CPUリソースの消費、CPUの演算能力のおかげでの多数によって特徴付けられます。この計算集約的なタスクもマルチタスクが、複数のタスクを用いて達成することができるが、タスク切り替えに費やされるより多くの時間は、CPUの効率が低く、したがって、タスクを実行するCPUの最も効率的な使用であることが、計算集約同時に、タスクの数は、CPUコアの数に等しくなければなりません。

メイン計算集約型のタスクがCPUリソースを消費し、従ってので、コードの動作効率が不可欠です。Pythonのスクリプト言語は、計算集約型のタスクのために全く適さない、非効率的に実行します。計算集約型のタスクの場合、それは最高のC言語で記述されています。

第二のタイプは、ネットワークを含む、IO集約型のタスクで、ディスクIOタスクはIO集約型のタスクです、タスクのこのタイプの特徴は、CPUの消費量で、タスクがIO操作を待っている時間のほとんどが完了しました(理由IOは、CPUとメモリの速度)よりもはるかに遅いです。IO集中型のタスクのために、より多くのタスクが、高いCPU効率が、しかし限界があります。最も一般的なタスクは、WebアプリケーションなどのIO集約型のタスクです。

実行中のIO集約型のタスク、時間の99%は、IOに費やされ、ほんの少しの時間は、C言語はに完全にできない、この低速のPythonスクリプト言語に置き換えた、非常に高速で実行されているので、CPUに費やさ業務効率を向上させます。IO集中型のタスクのために、最も適切な言語が最も効率的な(コードの最低額)を開発することである言語、スクリプト言語が好ましく、C言語で最悪。

非同期IO

ほとんどの時間は、IO操作を待っているタスクの実行中に、CPUとIOの間の速度に大きな違いを考慮すると、シングルスレッドのプロセス・モデルの他のタスクにつながる並列に実行することはできませんので、我々は、マルチプロセスモデルを必要としますまたは複数のタスクの同時実行をサポートするためのモデルをマルチスレッド。

IO操作上の近代的なオペレーティングシステムでは、巨大な改善をした、最大の特徴は、非同期IOのサポートです。非同期IOの完全な使用は、オペレーティングシステムをサポートしている場合、あなたは複数のタスクを実行するためにシングルスレッドプロセスモデルを使用することができ、イベント駆動型モデルと呼ばれるこの新しいモデル、nginxのは、効率的にマルチタスクをサポートすることができるシングルコアCPUモデルに単一のプロセスを使用して、非同期IO WebサーバーをサポートすることですマルチコアCPU上では、マルチコアCPUをフルに活用、複数のプロセス(同じ数とCPUコアの数を)実行することができます。オペレーティング・システムのスケジューラは、非常に効率的であるように、プロセスは、非常に限られているシステムの総数からです。マルチタスクに非同期IOのプログラミングモデルは、主要な傾向です。

Python言語、コルーチンと呼ばれるシングルスレッドの非同期プログラミングモデルに対応し、コルーチンのサポートにより、あなたはイベント駆動型で効率的なマルチタスクのプログラムを書くことができます

おすすめ

転載: blog.csdn.net/xili2532/article/details/89882511