セクションI:プロセス
セクションII:Pythonのマルチプロセッシングの例
セクションIII:プロセス・パラメータ
セクションIV:取得プロセスID
セクションV:のタスクとマルチプロセス・パラメータ
セクションVI:グローバル変数は、プロセス間で共有されていません
セクションVII:すべての子プロセスのメイン処理待ち再側端を実行します
セクションVIII:プロセスサブクラスは、子プロセスを作成します
IX:プロセス・プール
セクションX:プロセス間通信
1、プロセス
または実行中のソフトウェア・プログラムはプロセスであり、
- リソース割り当てのためのオペレーティング・システムの基本的な単位
- 各プロセスを開始する、オペレーティングシステムは、プロセスを実行することを保証するために、特定のオペレーティング・リソース(メモリリソース)を割り当てます
- 処理後に実行されている少なくとも一つのプログラム
- プロセスは、デフォルトのスレッドを持っています
- 複数のスレッドを作成することができますプロセス
- スレッドは、プロセスの内部に取り付けられている、どのプロセスにはスレッドではありません
- 実際の作業はスレッドです
メインプロセスがグループのようなものです、ここのグループは、多くの子会社(子)、グループ自体が会社であり、各企業は異なる位置にある従業員の実際の作業は、(スレッド/マルチスレッド)
2、Pythonのマルチプロセッシング例
multi_process.py
import multiprocessing
import time
def listen_music():
for i in range(3):
print('听音乐......','进程名:%s'%multiprocessing.current_process().name)
time.sleep(0.2)
def read_book():
for i in range(3):
print('看书......','进程名:%s'%multiprocessing.current_process().name)
time.sleep(0.2)
if __name__ == '__main__':
# 创建听音乐进程(子进程)
listen_music_process = multiprocessing.Process(target=listen_music,name='我是听音乐的进程')
# 创建看书进程 (子进程)
read_book_process = multiprocessing.Process(target=read_book,name='我是看书的进程')
# 启动子进程
listen_music_process.start()
read_book_process.start()
業績
听音乐...... 进程名:我是听音乐的进程
看书...... 进程名:我是看书的进程
听音乐...... 进程名:我是听音乐的进程
看书...... 进程名:我是看书的进程
听音乐...... 进程名:我是听音乐的进程
看书...... 进程名:我是看书的进程
図3に示すように、プロセスパラメータ及び方法が記載さ
BaseProcessから継承されたプロセス
class BaseProcess(object):
def __init__(self, group=None, target=None, name=None, args=(), kwargs={},
*, daemon=None):
パラメータ:
- グループ:指定されたプロセス・グループ、デフォルトはNoneです(公式解説:グループは常にNoneにする必要があり、それは互換性のためだけにthreading.Thread目標は、run()メソッドによって呼び出される呼び出し可能オブジェクトです。)
- ターゲット:幹部の目標とタスク(関数に渡された名前ではなく、関数呼び出し)
- 名前:プロセスの名前(あなたがプロセス名を指定するには、このパラメータを使用することができ、multiprocessing.current_process()の名前は、プロセス名を取得することができます。)
- 引数は:タプルは、タスクパラメータ(目標/パラメータ渡す方法に指定された機能)を実行する方法を渡します
- kwargsから:タスクを実行するモードを渡す辞書パラメータ(渡すパラメータ指定された関数/メソッドを標的とします)
常⽤⽅法:
- is_alive():プロセス・インスタンスがYESまだあるかどうかを決定します。
- 参加する(自己、タイムアウト=なし):子プロセスが終了するまで待ち、
- 開始():(サブメニューのプロセスを作成する)プロセスのインスタンスを開始します。
- ()を実行します。対象タスクが指定されていない場合は、スタート()の治療の時間を使って、このオブジェクトの転送は、実行されます
⾏オブジェクトの実行を()の治療; - 終了():まだ注目を集めるため、すぐにプロセスを終了します。
図4に示すように、取得プロセス番号
import os
os.getpid() 表示获取当前进程编号
os.getppid() 表示获取当前父进程编号
目的は、マスターと子プロセス間の関係を確認するためのプロセスIDを取得することで、あなたはマスター・プロセスによって作成された子プロセスのアウトを学ぶことができます
multi_process_id.py
import multiprocessing
import time
import os
def listen_music():
# 获取当前进程的编号
print('listen_music 进程当前编号:',os.getpid())
# 获取当父进程的编号
print('listen_music 父程当前编号:',os.getppid())
for i in range(3):
print('听音乐......','进程名:%s'%multiprocessing.current_process().name)
time.sleep(0.2)
def read_book():
# 获取当前进程的编号
print('read_book 进程当前编号:', os.getpid())
# 获取当父进程的编号
print('read_book 父进程当前编号:', os.getppid())
for i in range(3):
print('看书......','进程名:%s'%multiprocessing.current_process().name)
time.sleep(0.2)
if __name__ == '__main__':
# 获取当前进程的编号
print("主进程 main 编号:", os.getpid())
# 创建听音乐进程(子进程)
listen_music_process = multiprocessing.Process(target=listen_music,name='我是听音乐的进程')
# 创建看书进程 (子进程)
read_book_process = multiprocessing.Process(target=read_book,name='我是看书的进程')
# 启动子进程
listen_music_process.start()
read_book_process.start()
業績
主进程 main 编号: 2281
listen_music 进程当前编号: 2283
listen_music 父程当前编号: 2281
听音乐...... 进程名:我是听音乐的进程
read_book 进程当前编号: 2284
read_book 父进程当前编号: 2281
看书...... 进程名:我是看书的进程
听音乐...... 进程名:我是听音乐的进程
看书...... 进程名:我是看书的进程
听音乐...... 进程名:我是听音乐的进程
看书...... 进程名:我是看书的进程
パラメータを持つ5、マルチタスク処理
- 質量参加のタスクを実行するように発現引数タプル
- 質量参加のタスクを実行するための辞書のように表現さkwargsから
multi_process_args.py
import multiprocess
import time
def task(task_name):
for i in range(3):
print('我的任务名:',task_name)
time.sleep(0.2)
if __name__ == '__main__':
# 任务一:听歌
task1 = multiprocessing.Process(target=task,args=('听歌...',))
# 任务二:看书
task2 = multiprocessing.Process(target=task,kwargs={'task_name':'看书...'})
# 启动任务
task1.start()
task2.start()
業績
我的任务名: 听歌...
我的任务名: 看书...
我的任务名: 听歌...
我的任务名: 看书...
我的任务名: 看书...
我的任务名: 听歌..
6、グローバル変数は、プロセス間で共有されていません
子プロセスがプライマリプロセスのコピーであることを意味し、主プロセスのリソースを、コピーした子プロセスを作成し、なぜプロセスは、グローバル変数の操作内の同じではないため、プロセス間のグローバル変数を共有するが、異なるプロセスではありません唯一、同じ名前の内部のグローバル変数。
multi_process_global_var.py
import multiprocessing
import os
MY_LIST = []
def task(task_name):
print(task_name, '的父进程id:', os.getppid())
for i in range(3):
print(i, task_name, '的进程id', os.getpid())
MY_LIST.append(i)
print(task_name, ',MY_LIST:', MY_LIST)
if __name__ == '__main__':
print('主进程id:', os.getppid())
task1 = multiprocessing.Process(target=task, args=('task1',))
task2 = multiprocessing.Process(target=task, args=('task2',))
task1.start()
task2.start()
task1.join()
task2.join()
print('主进程 MY_LIST', MY_LIST)
業績
主进程id: 14628
task2 的父进程id: 1976
0 task2 的进程id 17040
1 task2 的进程id 17040
2 task2 的进程id 17040
task2 ,MY_LIST: [0, 1, 2]
task1 的父进程id: 1976
0 task1 的进程id 16436
1 task1 的进程id 16436
2 task1 的进程id 16436
task1 ,MY_LIST: [0, 1, 2]
主进程 MY_LIST []
図7に示すように、すべての子プロセスのメイン処理待ち再側端を実行します
孤立
通常の状況下では、すべての子プロセスのための主要なプロセスは待機が終了してから終了を実行しますが、主なプロセス突然キル場合、プロセスの残りの部分は、「孤立」と呼ばれています
ゾンビプロセス
もし終了後の子プロセス()、親プロセスは、プロセスIDによって占められていた情報を公開しません、予約期間は、このプロセスが呼び出された「ゾンビ・プロセス」に対処する時間がありません。
8、プロセスのサブクラスは、子プロセスを作成します
Processクラスのrunメソッド
ターゲットパラメータは、時にスタートを使用してオブジェクト転送()救済与えられていない場合は、実行されます
⾏オブジェクトの実行()救済を
multi_process_run
import os
from multiprocessing import Process
class MyMultiProcess(Process):
def __init__(self, task_name):
Process.__init__(self)
self.task_name = task_name
def run(self):
for i in range(3):
print(i, self.task_name, '的进程id', os.getpid(),'---','父进程id:',os.getppid())
if __name__ == '__main__':
print('父进程id:', os.getpid())
p1 = MyMultiProcess('task1')
p2 = MyMultiProcess('task2')
p1.start()
p2.start()
業績
父进程id: 15292
0 task1 的进程id 6596 --- 父进程id: 15292
0 task2 的进程id 12540 --- 父进程id: 15292
1 task1 的进程id 6596 --- 父进程id: 15292
1 task2 的进程id 12540 --- 父进程id: 15292
2 task1 的进程id 6596 --- 父进程id: 15292
2 task2 的进程id 12540 --- 父进程id: 15292
9、プロセスプール
プロセスプールは、迅速に処理タスクの多くを生成する、高度なタスク処理の最大数は待ちタスクに戻る次に、冗長なタスクの数を設定すると、すべてのプロセスは、プロセスの最大数は、同時に実行しているプロセスのプールが、プール処理するタスクを追加するために使用され最初のうち。
multi_process_pool
from multiprocessing import Pool
import os
def task(task_name):
for i in range(3):
print(task_name, '的进程id', os.getpid(), '---', '父进程id:', os.getppid())
if __name__ == '__main__':
# 定义⼀个进程池,最⼤进程数2
process_pool = Pool(2)
# 往进程添加任务
for i in range(3):
# 非堵塞的方式添加任务
process_pool.apply_async(func=task,args=('任务%s'%(i+1),))
# 关闭进程池 , 关闭后不再添加新的任务
process_pool.close()
process_pool.join()
業績
任务1 的进程id 8624 --- 父进程id: 6372
任务2 的进程id 17188 --- 父进程id: 6372
任务1 的进程id 8624 --- 父进程id: 6372
任务2 的进程id 17188 --- 父进程id: 6372
任务1 的进程id 8624 --- 父进程id: 6372
任务2 的进程id 17188 --- 父进程id: 6372
任务3 的进程id 8624 --- 父进程id: 6372
任务3 的进程id 8624 --- 父进程id: 6372
任务3 的进程id 8624 --- 父进程id: 6372
プール頻繁に使用される方法:
- apply_async(FUNC、引数=() 、kwds = {}): 使用して、非ブロッキング(および⾏エグゼクティブFUNCを使用シャッターモード調整を
遮断シャッターモードは、前プロセスの終了にあなたのために待つ必要があり、⾏次それに処理を行うように)、引数さ
FUNCのパラメータリストに渡された、キーワード引数としてkwdsは、FUNCのリストに渡されました。 - 適用(FUNC、引数=()、kwds = {}):トーンを使用してブロッキングシャッターモードを使用FUNC
- 近い():閉じるプールは、それが新しいタスクを受け入れなくなりました。
- 終了():タスクが完了したかどうか、すぐにはまだのために終了注意。
- 参加する():メインプロセスブロックを、後に閉じるか、終了する必要があります終了サブメニューへのプロセスを待って
使用。
10、プロセス間通信
マルチプロセッシングモジュールキュー複数のプロセス間のクラスが実装するデータ転送
「」」
「」」