day34进程相关
進(jìn)程
1 什么是進(jìn)程
??? 進(jìn)程指的是一個(gè)正在進(jìn)行/運(yùn)行的程序,進(jìn)程是用來(lái)描述程序執(zhí)行過(guò)程的虛擬概念
??? 進(jìn)程vs程序
??? 程序:一堆代碼
??? 進(jìn)程:程序的執(zhí)行的過(guò)程
??? 進(jìn)程的概念起源于操作系統(tǒng),進(jìn)程是操作系統(tǒng)最核心的概念,操作系統(tǒng)其它所有的概念都是圍繞進(jìn)程來(lái)
??? 操作系統(tǒng)理論:
??????????? 操作系統(tǒng)是一個(gè)協(xié)調(diào)\管理\控制計(jì)算機(jī)硬件資源與應(yīng)用軟件資源的一段控制程序
??????????? 有兩大功能:
??????????????? 1. 將復(fù)雜的硬件操作封裝成簡(jiǎn)單的接口給應(yīng)用程序或者用戶去使用
??????????????? 2. 將多個(gè)進(jìn)程對(duì)硬件的競(jìng)爭(zhēng)變得有序
??? 操作系統(tǒng)發(fā)展史
??????? 并發(fā): 多個(gè)任務(wù)看起來(lái)是同時(shí)運(yùn)行的
??????? 串行:一個(gè)任務(wù)完完整整地運(yùn)行完畢,才能運(yùn)行下一個(gè)任務(wù)
??????? 多道技術(shù):(復(fù)用=>共享/共用)
??????????? 1. 空間上的復(fù)用:多個(gè)任務(wù)復(fù)用內(nèi)存空間
??????????? 2. 時(shí)間上的復(fù)用:多個(gè)任務(wù)復(fù)用cpu的時(shí)間
??????????????? 1. 一個(gè)任務(wù)占用cpu時(shí)間過(guò)長(zhǎng)會(huì)被操作系統(tǒng)強(qiáng)行剝奪走cpu的執(zhí)行權(quán)限:比起串行執(zhí)行反而會(huì)降低效率
??????????????? 2. 一個(gè)任務(wù)遇到io操作也會(huì)被操作系統(tǒng)強(qiáng)行剝奪走cpu的執(zhí)行權(quán)限:比起串行執(zhí)行可以提升效率
2 為何用進(jìn)程
?? 實(shí)現(xiàn)并發(fā)
3 如何用進(jìn)程
?開(kāi)啟子進(jìn)程的方式一:??#調(diào)研系統(tǒng)類地點(diǎn)方式
??from multiprocessing import Process
??import time
??def task(name):
???print('%s is running' %name)
???time.sleep(3)
???print('%s is done' %name)
??# 在windows系統(tǒng)上,開(kāi)啟子進(jìn)程的操作必須放到if __name__ == '__main__'的子代碼中
??if __name__ == '__main__':
???p=Process(target=task,args=('egon',))?? #Process(target=task,kwargs={'name':'egon'})
???p.start()?? # 只是向操作系統(tǒng)發(fā)送了一個(gè)開(kāi)啟子進(jìn)程的信號(hào)
???p.join()?# join:讓主進(jìn)程在原地等待,等待子進(jìn)程運(yùn)行完畢,不會(huì)影響子進(jìn)程的執(zhí)行(****)?
???print('主') # join:讓主進(jìn)程等待子進(jìn)程運(yùn)行完畢,即主進(jìn)程在原地阻塞,而不影響子進(jìn)程的運(yùn)行
??????
?開(kāi)啟子進(jìn)程的方式二:?? #自定義類的方式
??from multiprocessing import Process
??import time
??class Myprocess(Process):
???def __init__(self,name):
????super().__init__()
????self.name=name
???def run(self):
????print('%s is running' %self.name)
????time.sleep(3)
????print('%s is done' %self.name)
??# 在windows系統(tǒng)上,開(kāi)啟子進(jìn)程的操作必須放到if __name__ == '__main__'的子代碼中
??if __name__ == '__main__':
???p=Myprocess('egon')????????? #p為進(jìn)程對(duì)象
???p.start() # 只是向操作系統(tǒng)發(fā)送
4 進(jìn)程相關(guān)其它操作
?1. 進(jìn)程pid:每一個(gè)進(jìn)程在操作系統(tǒng)內(nèi)都有一個(gè)唯一的id號(hào),稱之為pid
?2.from multiprocessing import Process,current_process?
????? current_process()? #當(dāng)前進(jìn)程的pid,相當(dāng)于os.getpid().其中os.getppid():查看父進(jìn)程的pid
?3. 進(jìn)程對(duì)象其他相關(guān)的屬性或方法
??p.terminate()? 結(jié)束進(jìn)程p
??p.is_alive()?? 查看進(jìn)程p是否結(jié)束
?4.僵尸進(jìn)程和孤兒進(jìn)程:僵尸進(jìn)程指死掉的進(jìn)程. 孤兒進(jìn)程:父進(jìn)程死掉,子進(jìn)程變成孤兒進(jìn)程,此時(shí)父進(jìn)程為:INIT
?5.守護(hù)進(jìn)程: 本質(zhì)就是一個(gè)"子進(jìn)程",該"子進(jìn)程"的生命周期<=被守護(hù)進(jìn)程的生命周期
??p.daemon=True? #設(shè)置進(jìn)程p 為守護(hù)進(jìn)程
?6.互斥鎖? :from multiprocessing import Process,Lock
??mutex = Lock()??? #創(chuàng)建鎖對(duì)象
??for i in range(10):
??p=Process(target=task,args=('路人%s' %i,mutex))? #創(chuàng)建進(jìn)程時(shí)把互斥鎖傳進(jìn)之進(jìn)程中
??p.start()
??def task(name,mutex):
???search(name) #并發(fā)
???mutex.acquire()? #開(kāi)始上鎖
???get(name) #變成串行
???mutex.release()? #解鎖
??join VS 互斥鎖
??????? join:是將代碼整體串行
??????? 互斥鎖:是將代碼中的關(guān)于修改共享數(shù)據(jù)的 那一小部分代碼變成串行,犧牲了效率保證數(shù)據(jù)安全
5.進(jìn)程間通信(ICP機(jī)制)
?#隊(duì)列=管道+鎖? from multiprocessing import Queue
?q=Queue() #創(chuàng)建隊(duì)列
?q.put(['first',]) #向隊(duì)列中傳入一個(gè)元素
?q.get()?? #向隊(duì)列中取出一個(gè)元素
?q=Queue(3) #隊(duì)列中最大元素的個(gè)數(shù)
?q.put(['first',],block=True,timeout=3)? #隊(duì)列已滿時(shí)等待3秒,如果block=False,若隊(duì)列已滿直接報(bào)錯(cuò)
?q.get(block=True,timeout=3)? #隊(duì)列為空時(shí)等待3秒,如果block=False,若隊(duì)列為空直接報(bào)錯(cuò)
?q.put_nowait(1) #等效于q.put(1,block=False)
?q.get_nowait()) #等效于q.get(block=false)
6.生產(chǎn)者消費(fèi)者模型(******)
?1. 什么是生產(chǎn)者消費(fèi)者模型
??生產(chǎn)者:代指生產(chǎn)數(shù)據(jù)的任務(wù)
??消費(fèi)者:代指處理數(shù)據(jù)的任務(wù)
??該模型的工作方式:
???生產(chǎn)生產(chǎn)數(shù)據(jù)傳遞消費(fèi)者處理
???實(shí)現(xiàn)方式:生產(chǎn)者---->隊(duì)列<------消費(fèi)者
?2. 為何要用
??當(dāng)程序中出現(xiàn)明細(xì)的兩類任務(wù),一類負(fù)責(zé)生產(chǎn)數(shù)據(jù),一類負(fù)責(zé)處理數(shù)據(jù)
??就可以引入生產(chǎn)者消費(fèi)者模型來(lái)實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者的解耦合,平衡生產(chǎn)能力與消費(fèi)能力,從提升效率
?3. 如何用
??import time,random
??from multiprocessing import Process,Queue
??def producer(name,food,q):
???for i in range(3):
????res='%s%s' %(food,i)
????time.sleep(random.randint(1,3)) #模擬生產(chǎn)數(shù)據(jù)的時(shí)間
????q.put(res)
????print('廚師[%s]生產(chǎn)了<%s>' %(name,res))
??def consumer(name,q):
???while True:
????res=q.get()
????if res is None:break
????time.sleep(random.randint(1,3)) #模擬處理數(shù)據(jù)的時(shí)間
????print('吃貨[%s]吃了<%s>' %(name,res))
??if __name__ == '__main__':
???q=Queue()
???# 生產(chǎn)者們
???p1=Process(target=producer,args=('小Egon','泔水',q))
???p2=Process(target=producer,args=('中Egon','屎包子',q))
???p3=Process(target=producer,args=('大Egon','腰子湯',q))
???# 消費(fèi)者們
???c1=Process(target=consumer,args=('劉清正',q))
???c2=Process(target=consumer,args=('吳三江',q))
???p1.start()
???p2.start()
???p3.start()
???c1.start()
???c2.start()
???p1.join()
???p2.join()
???p3.join()
???q.put(None)
???q.put(None)
???print('主')
?4.補(bǔ)充了解第二種實(shí)現(xiàn)方式:
??import time,random
??from multiprocessing import Process,JoinableQueue? #可調(diào)用隊(duì)列
??def producer(name,food,q):
???for i in range(3):
????res='%s%s' %(food,i)
????time.sleep(random.randint(1,3)) #模擬生產(chǎn)數(shù)據(jù)的時(shí)間
????q.put(res)
????print('廚師[%s]生產(chǎn)了<%s>' %(name,res))
??def consumer(name,q):
???while True:
????res=q.get()
????time.sleep(random.randint(1,3)) #模擬處理數(shù)據(jù)的時(shí)間
????print('吃貨[%s]吃了<%s>' %(name,res))
????q.task_done()
??if __name__ == '__main__':
???q=JoinableQueue()? #相當(dāng)與可調(diào)用的q=Queue()
???# 生產(chǎn)者們
???p1=Process(target=producer,args=('小Egon','泔水',q))
???p2=Process(target=producer,args=('中Egon','屎包子',q))
???p3=Process(target=producer,args=('大Egon','腰子湯',q))
???# 消費(fèi)者們
???c1=Process(target=consumer,args=('劉清正',q))
???c2=Process(target=consumer,args=('吳三江',q))
???c1.daemon=True? #設(shè)定為守護(hù)進(jìn)程
???c2.daemon=True? #設(shè)定為守護(hù)進(jìn)程
???#運(yùn)行進(jìn)程
???p1.start()
???p2.start()
???p3.start()
???c1.start()
???c2.start()
???#等待生產(chǎn)者進(jìn)程結(jié)束才繼續(xù)主進(jìn)程
???p1.join()
???p2.join()
???p3.join()
???q.join()? # 主進(jìn)程等q結(jié)束,即q內(nèi)數(shù)據(jù)被取干凈了
???print('主')
轉(zhuǎn)載于:https://www.cnblogs.com/wu-jia/p/9599964.html
總結(jié)
- 上一篇: CATIA2018客户端安装错误之提示R
- 下一篇: 超乎想象,数据揭示自学成才的码农为何备受