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

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