日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

day34进程相关

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day34进程相关 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

轉載于:https://www.cnblogs.com/wu-jia/p/9599964.html

總結

以上是生活随笔為你收集整理的day34进程相关的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。