進程雜談
#進程就是正在執行的一個過程,是對正在運行程序的一個抽象
#進程由程序、數據集和進程控制塊(最重要的,進程切換 狀態如何保存,恢復和記錄)組成
"""
進程調度:
1.先來先服務
2.短作業優先調度
3.時間片輪轉法
4.多級反饋隊列
進程遇到IO就會被掛起
"""
'''
將一個單獨的cpu變成多個
虛擬的cpu(多道技術:時間多路復用和空間
多路復用+硬件上支持隔離)
沒有進程的抽象,現代計算機將不復存在
'''
'''
操作系統的作用:
1.隱藏丑陋復雜的硬件接口,提供良好的抽象接口
2.管理,調度進程,并且將多個進程對硬件的競爭變得有序
'''
'''
多道技術:
1.產生背景:針對單核,實現并發
ps:現在的主機一般是多核,那么每個核都會利用多道技術
空間復用
時間復用
'''
'''
同步和異步是通訊方式,阻塞和非阻塞是等待狀態
同步 阻塞:發出消息,不回就傻等。跟女神聊天,站在一旁等,什么都不干
同步 非阻塞:發消息,不回就等,但是干別的事情。跟女神聊天,站在一旁等,一邊吃飯一邊回頭看看手機等消息
異步 非阻塞:發消息,不回消息也不等,就去干別的。跟女神聊天,不回我就去外面打籃球,等聽到電話響了就去聊天
異步 阻塞:發消息,不回也不等,但是也不干別的。跟女神聊天,不回我就在屋里想其他美女,啥也不干。
'''
"""
串行
并發 切換+保存狀態
并行
CPU切換
開啟子進程的原因是為了支持并發
#這是一個函數,也相當于一個作業,
執行時開啟一個子進程,會把父進程整個放到新的名稱空間里面執行
,所以x=1也會放進去
x = 1
def task():
print(x)
主進程會等子進程全部運行結束才會結束
#僵尸進程:父進程的子進程結束的時候父進程沒有wait()情況下子進程會變成僵尸進程,即子進程先結束,父進程未回收子進程,沒有釋放子進程占用的資源
#孤兒進程:一個父進程退出,它的一個或多個子進程還在運行,那么這些子進程將成為孤兒進程。孤兒進程將會被init進程(進程號為1)所收養,并由init進程對它們完成狀態收集工作(是無害的)
#父進程等著子進程都死,回收僵尸進程,也是無害的
#父進程一直不死,造成了大量僵尸進程,占用了大量的pid號,是有害的,因為pid號是有限的,最簡單的解決辦法就是殺死父進程
python實現開啟進程
# multiprocess模塊:其實是一個操作管理進程的包,
# 包括創建進程部分,進程同步部分,進程池部分,
# 進程之間的數據共享
#下面的代碼會報錯,因為子進程會把父進程的代碼拷貝運行,再生成子進程在拷貝,,,,類似遞歸
from multiprocessing import Process
import time
def task():
print('進程 start')
time.sleep(2)
print('進程 end')
p = Process(target=task)#實例化出來對象,向操作系統發送開啟子進程的請求,還沒開啟子進程。
p.start()#告訴操作系統我要開啟子進程
#01 開啟子進程的方式一(調用模塊改進執行方法,加__name__ = __main__)
from multiprocessing import Process
import time
def Study(name, age):
print(f'{name}啟動了子進程1')
print(f'{name}的年齡是{age}')
def Play(name,age):
print(f'{name}啟動了子進程2')
print(f'{name}的年齡是{age}')
if __name__ == '__main__':
p = Process(target=Study, args=('nick', 18))
p2 = Process(target=Play, args=('tank', 49))
p.start() #只是發送請求開啟子進程,
# time.sleep(2)
p2.start()#只是發送請求開啟子進程,
print('執行了父進程') #按順序執行下來,比上面兩個start要先執行
#開啟子進程的方式二(寫一個類繼承Process類)
from multiprocessing import Process
class Study(Process):
def __init__(self, name):
super().__init__() #寫完這個,下面的name又變成了Test-2
self.name = name
print(name)
def run1(self, v):
self.v = v
print(f'{self.name}的跑步速度是{v}')
if __name__ == '__main__':
p = Study('nick')
p.start()
p.run1(29)
#3 驗證進程的內存空間隔離
from multiprocessing import Process
import time
x = 0
def task():
global x
x = 100
print(f'子進程的x修改為了{x}')
if __name__ == '__main__':
p = Process(target=task)
p.start()
time.sleep(3)
print(x) #先打印100,再打印0
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
