Pythonの多くのプロセス、マルチスレッド
まず、プロセスは何ですか?
二つの概念を区別して処理
プログラムをコンピュータプログラムは、実行可能なバイナリディスクや他のデータです。彼らは唯一のメモリに読み込まで使用されている、彼らは彼らのライフサイクルのオペレーティング・システム・コールを開始します。
工程(時々ヘビープロセスと呼ぶ)は、最初のパフォーマンスのプログラムです。各プロセスは、独自のアドレス空間、メモリ、データ、スタック、およびその動作に関連する他のデータを持っています。オペレーティングシステムは、その上で実行中のすべてのプロセスを管理します。プロセス間には、独自のメモリ空間、データ、スタック、およびので、あなただけのプロセス間通信を使用することができますが、直接、情報を共有することはできませんにしています。
プログラムの過程の間の主な相違点
1)プログラムは永遠であり、このプロセスは一時的なものであり、データセット上で実行されるとプログラムで、作成した存在は一時的なもので脱退した;
2)プログラム静的概念であり、プロセスは動的です概念、
同時性を持つプロセスが、プログラムにはない、
競争のプロセスは、コンピュータリソースの基本単位である、プログラムではありません。
プロセスおよび手順は、1対1ではない:複数のプログラム、プロセス、すなわち同じプロセス実行可能プログラムの複数に対応することができる、プロセスは、1つ以上の手順を実行します
第二に、スレッドは何ですか?
幾分同様のプロセスとスレッドは(時には軽量プロセスとも呼ばれる)、プロセスで実行中のスレッドことを除いて、同じプロセスのスレッドは、同じ動作環境を共有します。
スレッドとプロセス間の関係は、
スレッドが順序と三つの部分の最後の実装を開始しました。これは、独自の命令ポインタに実行するための独自の場所を記録しています。実行中のスレッドは先取り(中断)、または一時的に、(スリープ)、サスペンドので、他のスレッドということができます。あなたはプロセス間よりもスレッド間で互いにデータを共有して、より簡単に通信できるように、プロセスの各スレッド間でデータを共有します。
複数のスレッドが一緒にデータの同じ部分にアクセスする場合にマルチスレッド実行時に、それはデータが一貫性のない結果につながる可能性があり、シーケンシャルデータのアクセスの不整合に起因し得ます。だから、メモリ危険な共有特定のスレッドがあります。
第三に、Pythonのグローバルインタープリタロック(GIL)は何ですか?
Pythonコードは、実際には、Pythonのは、メインループであることを考慮して設計された、コントロールにPythonの仮想マシンで実行される唯一のスレッド実行します。Pythonインタプリタは、複数のスレッドを実行することができますが、しかし、一つだけのスレッドは、いつでもインタプリタで実行されています。
Pythonの仮想マシンへのアクセスの場合、このロックは同時に実行に1つだけのスレッドを可能にするからこその、グローバルインタプリタロック(グローバルインタプリタロック)によって制御されています。
Pythonで第四には、マルチプロセスの使用
注意:あなたはマルチプロセッシングを使用して新しいプロセスを作成するたびに、メインプロセスパラメータとステータスのすべてのコピー。だから、グローバル変数の主なプロセスを呼び出して、この時間は可能ですが、主要なプロセスを変更した後にアップロードされることはありません。
システム初期化処理に加えて、各プロセスは、親プロセスがあり、ゼロ以上の子プロセスが存在してもよいです。これにより、親と子の関係を形成します。
これは主にPythonのマルチプロセッシングモジュールによって今日のマルチプロセスを作成するには、Pythonで複数のプロセスのためのモジュールの数を提供します。
マルチプロセスのPythonの例:
!- -コーディング:UTF8を- -
マルチプロセッシングインポート
時間インポート眠りから、CTIME
デフ仕事(フラグ= 0):
印刷( "!仕事%sの開始" %フラグ、CTIME())
睡眠(4)
印刷( "!仕事%sのエンド" %フラグ、CTIME())
もし名前 == ' メイン '
T1 = multiprocessing.Process(目標=仕事、引数=(1))
T2 = multiprocessing.Process(目標=仕事、引数=(2))
= T3 = multiprocessing.Process(ターゲット作業、引数=(3))
t1.start()
t2.start()
t3.start()
例二つのマルチプロセッシングのPython:
!- -コーディング:UTF8を- -
マルチプロセッシングインポート
時間インポート眠りから、CTIME
デフ仕事(フラグ= 0):
印刷( "!仕事%sの開始" %フラグ、CTIME())
睡眠(4)
印刷( "!仕事%sのエンド" %フラグ、CTIME())
process_num = 5
DEFメイン():
プロセス= []
の範囲内のiについて(process_num):
T = multiprocessing.Process(目標=仕事、引数=(I))
process.append(T)
for i in process:
i.start()
for i in process:
i.join()
もし名前 ==「メイン」:
メイン()
Pythonは例三つのマルチプロセッシング:
!- -コーディング:UTF8を- -
マルチプロセッシングインポート
時間インポート眠りから、ctimeの
輸入OS
クラスMyProcess(multiprocessing.Process):
def __init__(self, flag):
multiprocessing.Process.__init__(self)
self.flag = flag
def run(self):
print("work %s start!" % self.flag, ctime())
print("子进程%s开始执行,pid=%s; 父进程:ppid=%s" % (self.flag, os.getpid(), os.getppid()))
sleep(4)
print("work %s end!" % self.flag, ctime())
process_num = 5
DEFメイン():
プロセス= []
の範囲でI(process_num)用:
T = MyProcess(I)
process.append(T)
for i in process:
i.start()
for i in process:
i.join()
もし名前 ==「メイン」:
メイン()
マルチプロセスのPythonのプロセスプール:
なぜ使用のプロセスプール?
理由:マルチプロセスを完了するために必要なタスクの数が多い場合は、リソース消費量の計算により持参し、頻繁に除去プロセスを作成する必要があります。
原則:保留中のイベントを処理するために、プロセスのプールに適切なプロセスを作成し、プロセスが破壊されていない処理した後、まだプロセス・プール内の他のイベントを待っています。多重化処理は、リソースの消費を低減します。
Pythonは例四マルチプロセッシング:
!- -コーディング:UTF8を- -
マルチプロセッシングインポート
時間インポート眠りから、ctimeの
輸入OS
デフ仕事(フラグ= 0):
印刷( "!仕事%sの開始" %フラグ、CTIME())
睡眠(4)
印刷( "!仕事%sのエンド" %フラグ、CTIME())
リターン「仕事%の成功" % 国旗
メインDEF():
#は、スレッドプールを作成
pool_num = multiprocessing.Pool(4)
process = []
for i in range(10):
p = pool_num.apply_async(func=work, args=(i,))
process.append(p)
#关闭线程池
pool_num.close()
#回收
pool_num.join()
for i in process:
print(i.get())
もし名前 ==「メイン」:
メイン()
第五に、Pythonのマルチスレッドの使用
注:
ではPythonの複数のスレッドは、実行途中の各スレッドは:
GIL(グローバルインタプリタロック(グローバルインタプリタロック))を取得
睡眠までのコードを実行したり、Pythonの仮想マシンが一時停止します
リリースGILは
、スレッドとスレッドはプログラマがスレッドを作成し、管理することを可能にする、などのスレッド、スレッド、など、Pythonでマルチスレッドのためのいくつかのモジュールを提供します。
マルチスレッドPythonの例:
!- -コーディング:UTF8を- -
インポートスレッディング
時間インポート眠りから、CTIME
デフ仕事(フラグ= 0):
印刷( "!仕事%sの開始" %フラグ、CTIME())
睡眠(4)
印刷( "!仕事%sのエンド" %フラグ、CTIME())
もし名前 == ' メイン '
T1 = threading.Thread(目標=仕事、引数=(1))
T2 = threading.Thread(目標=仕事、引数=(2))
= T3 = threading.Thread(ターゲット作業、引数=(3))
t1.start()
t2.start()
t3.start()
Pythonのマルチスレッドの例2:
!- -コーディング:UTF8を- -
インポートスレッディング
時間インポート眠りから、CTIME
デフ仕事(フラグ= 0):
印刷( "!仕事%sの開始" %フラグ、CTIME())
睡眠(4)
印刷( "!仕事%sのエンド" %フラグ、CTIME())
thread_num = 5
DEFメイン():
スレッド= []
の範囲内のiについて(thread_num):
T = threading.Thread(目標=仕事、引数=(I))
threads.append(T)
for i in threads:
i.start()
for i in threads:
i.join()
もし名前 ==「メイン」:
メイン()
Pythonのマルチスレッドの例3:
!- -コーディング:UTF8を- -
インポートスレッディング
時間インポート眠りから、CTIME
クラスMyThread(threading.Thread):
def __init__(self, flag):
threading.Thread.__init__(self)
self.flag = flag
def run(self):
print("work %s start!" % self.flag, ctime())
sleep(4)
print("work %s end!" % self.flag, ctime())
thread_num = 5
DEFメイン():
スレッド= []
の範囲内のiについて(thread_num):
T = MyThread(I)
threads.append(T)
for i in threads:
i.start()
for i in threads:
i.join()
もし名前 ==「メイン」:
メイン()
Pythonのスレッドの同期マルチスレッド
、共通のデータ変更の複数のスレッド場合、予期しない結果は、データの正確性、複数のスレッドが同期する必要性を確保するために、起こり得ます。ロックとRLOCKを使用してスレッド・オブジェクトは、単純なスレッドの同期を達成することができ、2つのオブジェクトがメソッドの取得と解放のメソッドを持って、一つのスレッドだけ動作するデータを許可する必要がある人のために、操作がの取得および解放メソッドをドロップすることができます部屋。
複数のタスクを同時に実行することができ、複数のスレッドの利点。スレッドが共有データに必要がある場合でも、データは同期の問題がある可能性があります。
Pythonのマルチスレッド例4:
!- -コーディング:UTF8を- -
インポートスレッディング
時間インポート眠りから、CTIME
合計= 0
クラスMyThread(threading.Thread):
def __init__(self, flag, my_lock):
threading.Thread.__init__(self)
self.flag = flag
self.my_lock = my_lock
def run(self):
print("work %s start!" % self.flag, ctime())
self.my_lock.acquire()
global sum
for i in range(100000):
sum = sum + 1
self.my_lock.release()
print("work %s end!" % self.flag, ctime())
thread_num = 5
DEFメイン():
thread_lock = threading.Lock()
スレッド= []
の範囲内のiについて(thread_num):
T = MyThread(I、thread_lock)
threads.append(T)
for i in threads:
i.start()
for i in threads:
i.join()
もし名前 == ' メイン ':
main()の
プリント(合計)