限り並行プログラミングプロセス
マルチプロセッシングモジュールの紹介
- 機能
- 子プロセスは、通信とデータを共有し、異なる形式を同期プロセス、キュー、パイプ、ロックおよびその他のコンポーネントを提供します。
Processクラスの使い方
Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)
强调:
1. 需要使用关键字的方式来指定参数
2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
パラメータ
1 group参数未使用,值始终为None 2 target表示调用对象,即子进程要执行的任务 3 args表示调用对象的位置参数元组,args=(1,2,'egon',) 4 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18} 5 name为子进程的名称
方法
1 group参数未使用,值始终为None 2 target表示调用对象,即子进程要执行的任务 3 args表示调用对象的位置参数元组,args=(1,2,'egon',) 4 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18} 5 name为子进程的名称
プロパティ
1 p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置 2 p.name:进程的名称 3 p.pid:进程的pid 4 p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可) 5 p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功
使用方法.join
#作用:父进程等待子进程结束 from multiprocessing import Process def task(i): print(i) if __name__ == '__main__': for i in range(10): p = Process(target=task,args=(i,)) p.start() p.join() print("主进程结束")
多重化
- 空間分離
- 複数のプログラムが互いに分離メモリ、物理的な分離のレベルを共有します
- 時間的隔離
- 複数のプログラムは、CPUを共有します
- ハンドオーバー条件平行CPU
- I / Oの閉塞
- あまりにも長い間占有
シリアル、パラレル、同時
- シリアル:完全なプログラムの実装の完全なアカウントは、次のプログラムを再実行し
- 同時実行:シングルコアCPUは、同時に複数のプログラムを実行します
- パラレル:同時にプログラムの複数のCPUを実行している複数の
子プロセスをオープンするには、2つの方法
モード1
from multiprocessing import Process def task(): pass if __name__ == '__main__': p = Process(target=task) p.start()
モード2
from multiprocessing import Process class myP(Process): def run(self): pass if __name__ == '__main__': p = myP() p.start()
ゾンビプロセス、孤児プロセス、デーモン
ゾンビプロセス
- 子供は(pidは親プロセスを回復していない)プロセスを死にませんでした
孤立
- 親プロセスの終了、子プロセスがまだ実行されている、通常は孤児プロセスはinitは孤児院に相当し、initによって引き継がれた、子プロセスは、回復動作の終了を待つことになります
デーモン
主要プロセスの終了直後のコードの最後の行を終了
p = Process(target=task) p.daemon = True
コンセプトやプロセスロックの使用
シリアルコードの中にロックされました
すべてのルーチンは、シリアルとなり、処理が簡単にロックします参加の参加を比較すると、ロックコードは、シリアルなり
サンプルコード
from multiprocessing import Process,Lock import time def task(): print("11") def task1(): print("2222") def task3(lock1): task() lock1.acquire() time.sleep(2) task1() lock1.release() if __name__ == '__main__': lock1 = Lock() for i in range(30): p = Process(target=task3,args=(lock1,)) p.start()
キュー(待ち行列(キュー)=パイプライン(PIPE)+ロック(ロック))
キュー割り当て
q = Queue(队列中的数的最大数量) q.put(block=True,timeout=5) 参数block的意义在队列达到最大数量时是否阻塞,默认为阻塞(True) timeout的意义是设置最大阻塞时间
キュー値
q.get(block=True,timeout=5) 这里的block与timeout与上面的一样
プロデューサーの消費者モデル
プロデューサー<---->キュー<----->コンシューマ
役割:消費者モデルの生産を大幅に消費者の消費効率の生産効率と生産を改善しました。
Joinablequeuesの使用
q.put(相当于在队列中+1) q.get();q.task_dowm()相当于在队列中减一
- 参加内部このアクションは、ゼロにカウンターを待つことです
コードの実装
from multiprocessing import JoinableQueue,Process import time def shengchanzhe(q,name,food): for i in range(1,3): print(f"{name}生产了{food}{i}") res = f"{food}{i}" q.put(res) def xiaofeizhe(q,name): while True: res = q.get() time.sleep(1) print(f"{name}吃了{res}") q.task_done() if __name__ == '__main__': q = JoinableQueue() p1 = Process(target=shengchanzhe,args=(q,'厨师1','包子')) p2 = Process(target=shengchanzhe,args=(q,'厨师2','面条')) p3 = Process(target=shengchanzhe,args=(q,'厨师3','米饭')) c1 = Process(target=xiaofeizhe,args=(q,'小明')) c2 = Process(target=xiaofeizhe,args=(q,'小红')) p1.start() p2.start() p3.start() c1.daemon=True c2.daemon=True c1.start() c2.start() p1.join() p2.join() p3.join() q.join()