多進(jìn)程簡(jiǎn)單理解:
進(jìn)程之間是獨(dú)立的,是操作系統(tǒng)自己來(lái)維護(hù)和管理的,python通過(guò)C接口起了一個(gè)進(jìn)程,多進(jìn)程可以充分的利用多核CPU
- 多進(jìn)程的創(chuàng)建:
"""
multiprocessing模塊式python為開(kāi)發(fā)多進(jìn)程提供跨平臺(tái)的模塊模塊式python為開(kāi)發(fā)多進(jìn)程提供跨平臺(tái)的模塊
"""
from multiprocessing import Process
#參數(shù)可有可無(wú)
def run(path,name):
#while True:
for i in range(100):
print("唱歌去",path,name)
if __name__ == "__main__":
print("程序開(kāi)始運(yùn)行....")
#target屬性 指向執(zhí)行的函數(shù)(傳遞)汹买,不是調(diào)用返回值
#創(chuàng)建獨(dú)立的進(jìn)程對(duì)象(可以開(kāi)辟多個(gè)對(duì)象)
task1 = Process(target=run,args=("ktv","唱吧"))
#啟動(dòng)進(jìn)程
task1.start()
task2 = Process(target=run,args=("去酒吧","sssss"))
task2.start()
print("程序運(yùn)行結(jié)束")
多進(jìn)程間的通信:
進(jìn)程間獨(dú)立,如果想相互訪問(wèn),就必須有一個(gè)中間翻譯,下面提供了幾種進(jìn)程間通信的方法
- 進(jìn)程Queue
#import queue
from multiprocessing import Process,Queue
#子進(jìn)程唆途,內(nèi)存獨(dú)立阎曹,相當(dāng)于數(shù)據(jù)的傳遞
def x(subQueue):
subQueue.put("呵呵")
if __name__ == "__main__":
#進(jìn)程Queue
q = Queue()
#創(chuàng)建進(jìn)程
p = Process(target=f,args=(q,))
#執(zhí)行進(jìn)程
p.start()
print(q.get())
"""
Queue通信蝶押,相當(dāng)于父進(jìn)程賦值了一個(gè)Queue給子進(jìn)程,
子進(jìn)程在這個(gè)Queue放好數(shù)據(jù)后缀蹄,序列化一個(gè)中間翻譯螺戳,
然后在反序列化返回給父進(jìn)程醋旦,
因?yàn)檫M(jìn)程之間內(nèi)存獨(dú)立,不能傳遞對(duì)象咒劲,傳遞的其實(shí)是序列化的數(shù)據(jù)
"""
- Pipe:
多進(jìn)程有一種傳遞方式叫管道顷蟆,它的原理和Queue相同
from multiprocessing import Process,Pipe
#定義子進(jìn)程執(zhí)行
def x(Subconn):
Subconn.send("成績(jī)出來(lái)了嗎")
print("這個(gè)是父親的詢問(wèn):",Subconn.recv())
Subconn.close()
if __name__ == "__main__":
#創(chuàng)建管道兩端
parent_conn,child_conn = Pipe()
#創(chuàng)建子進(jìn)程
p = Process(target = x.argst =(child_conn,))
p.start() #控制流程
print("l來(lái)自兒子的問(wèn)候:",parent_conn.recv())
parent_conn.send("出來(lái)了腐魂,不怎么好")
p.join()
進(jìn)程鎖:
雖然內(nèi)存獨(dú)立,但是即使是打印也會(huì)造成打印數(shù)據(jù)錯(cuò)誤,為了防止進(jìn)程間搶屏幕打印輸出,加了進(jìn)程鎖
from multiprocessing import Process,Lock
#定義子進(jìn)程執(zhí)行
def x (lock,num)
lock.acquire()
print("哈哈帐偎,嘻嘻,嘿嘿",num)
lock.release
if __name__ == "__main__":
lock = Lock()
#循環(huán)創(chuàng)建50個(gè)子進(jìn)程
for num in range(50):
Process(target = x, args=(lock,num)).start()
進(jìn)程池:
當(dāng)我們需要的進(jìn)程數(shù)量不多的時(shí)候蛔屹,我們可以使用multiprocessing的Process類來(lái)創(chuàng)建進(jìn)程削樊。但是如果我們需要的進(jìn)程特別多的時(shí)候,手動(dòng)創(chuàng)建工作量太大了兔毒,所以Python也為我們提供了Pool(池)的方式來(lái)創(chuàng)建大量進(jìn)程漫贞。
from multiprocessing import Pool
import os,time
def run(msg):
print("開(kāi)始一個(gè)子線程運(yùn)行了……")
time.sleep(1)
print("開(kāi)始一個(gè)子線程運(yùn)行結(jié)束了……")
if __name__ == "__main__":
pool = Pool(3) # 表示初始化一個(gè)進(jìn)程池,最大進(jìn)程數(shù)為3
for x in range(10):
pool.apply_async(run, args=("hello pool",))
print("------start----")
pool.close() # 關(guān)閉池
pool.join() # 等待所有的子進(jìn)程完成育叁,必須放在close后面
print("-------end------")