多道技術
1.空間上的復用: 多個程式共用一套計算機硬體
2.時間上的復用: 切換+儲存狀態
1.當乙個程式遇到io操作,作業系統會剝奪該程式的cpu執行許可權(提高了cpu的利用率 並且也不影響程式的執行效率)
2.當乙個程式長時間占用cpu 作業系統也會剝奪該程式的cpu執行許可權(降低了程式的執行效率)
併發:看起來像同時執行的就可以
並行:真正意義上的同時執行
單核的計算機能不能實現並行,但是可以實現併發
同步非同步:表示的是任務的提交方式
同步:任務提交之後 原地等待的任務的執行並拿到返回結果才走 期間不做任何事(程式層面的表現就是卡住了)
非同步:任務提交之後 不再原地等待 而是繼續執行下一行**(結果是要的 但是是用過其他方式獲取)
阻塞非阻塞:表示的程式的執行狀態
阻塞:阻塞態
非阻塞:就緒態 執行態
建立程序的兩種方式
#建立程序會將**以模組的方式從上往下執行一遍
方式一from multiprocessing import
process
import
time
deftest(name):
print('
%s'%name)
time.sleep(1)
print('hi'
)if__name__ == '
__main__
': #
在建立程序時,在if __name__ == '__main__':內建立
p = process(target=test,args=('
egon
',)) #
建立乙個程序物件,括號內第乙個是函式名,第二個是傳入的引數,且是元組
p.start() #
告訴作業系統,要建立乙個程序
time.sleep(1)
print('
hello')
方式二from multiprocessing import
process
import
time
class
myclass(process):
def__init__
(self,name):
super().
__init__
() self.name =name
defrun(self):
print('
%s'%self.name)
time.sleep(1)
print('hi'
)if__name__ == '
__main__':
p = myclass('
egon')
p.start()
print('
gun')
join方法是先執行完子程式之後. 在執行主程式
from multiprocessing importprocess
import
time
deftest(name,i):
time.sleep(i)
print('
hello')
if__name__ == '
__main__':
#p_list =
#for i in range(3):
#p = process(target=test,args=('程序',i))
#p.start()##
for p in p_list:
#p.join()
#print('gun')
p = process(target=test,args=('
egon
',1))
p1 = process(target=test,args=('
jason
',2))
start_time =time.time()
p.start()
p1.start()
p.join()
p1.join()
print('hi'
)
print(time.time()-start_time)
程序物件的其他方法
from multiprocessing importprocess,current_process
import
osimport
time
deftest(name):
print('
%s'%name,current_process().pid,'
子程序%s
'%os.getpid(),'
父程序%s
'%os.getppid())
time.sleep(2)
print('
hello')
if__name__ == '
__main__':
p = process(target=test,args=('
egon
',))
p.start()
time.sleep(1)
p.terminate()
#殺死當前程序,本質是讓作業系統幫你去殺死乙個程序
time.sleep(1)
print(p.is_alive()) #
判斷程序是否存活
print('
gun')
殭屍程序與孤兒程序
父程序**子程序資源的兩種方式
1.join方法
2.父程序正常死亡
所有的程序都會步入殭屍程序
孤兒程序
子程序沒死 父程序意外死亡
針對linux會有兒童福利院(init) 如果父程序意外死亡他所建立的子程序都會被福利院收養
守護程序
from multiprocessing importprocess
import
time
deftest(name):
print('
%s'%name)
time.sleep(1)
print('
%s'%name)
if__name__ == '
__main__':
p = process(target=test,args=('
egon
',))
p.daemon = true #
將該程序設定為守護程序
p.start()
time.sleep(1)
print('
bye')
互斥鎖當多個程序操作同乙份資料的時候 會造成資料的錯亂
這個時候必須加鎖處理
將併發變成序列
雖然降低了效率但是提高了資料的安全
注意:1.鎖不要輕易使用 容易造成死鎖現象
2.只在處理資料的部分加鎖 不要在全域性加鎖
鎖必須在主程序中產生 交給子程序去使用
from multiprocessing importprocess,lock
import
time
import
json
defsearch(i):
with open(
'data
','r
',encoding='
utf-8
')as f:
data =f.read()
t_d =json.loads(data)
print('
使用者%s查詢餘票%s
'%(i,t_d.get('
ticket
')))
defbuy(i):
with open(
'data
','r
',encoding='
utf-8
')as f:
data =f.read()
t_d =json.loads(data)
time.sleep(1)
if t_d.get('
ticket
') >0:
t_d[
'ticket
'] -= 1with open(
'data
','w
',encoding='
utf-8
')as f:
json.dump(t_d,f)
print('
搶票成功')
else
:
print('
沒票了'
)def
run(i,mutex):
search(i)
mutex.acquire() #搶鎖
buy(i)
mutex.release()
#釋放鎖
if__name__ == '
__main__':
mutex = lock() #
生成一把鎖
for i in range(10):
p = process(target=run,args=(i,mutex))
p.start()
data文字文件
計算機發展史
早期的計算機 人們通過輸入裝置把需要處理的資訊輸入計算機,計算機通過 處理器把資訊加工後,再通過輸出裝置把結果告訴人們。特點 龐大 兩層樓那麼高 通過扣動面板上的無數開關來輸入資訊,通過讀取面板上的訊號燈來獲取結果。具有內部儲存器的計算機 在 處理器旁邊加乙個內部儲存器。特點 相當於一張稿紙。但無法...
計算機發展史
世界上第一台電子數字式計算機 於1946年2月15日 在美國賓夕法尼亞大學 正式投入執行,它的名稱叫 eniac 埃尼阿克 是 電子數值積分計算機 the electronic numberical intergrator and computer 的縮寫。它使用了17468個真空電子管,耗電174...
計算機發展史
計算 計算 儲存 可程式設計化計算 儲存 人工智慧 儲存 簡單的加減乘除算數運算工具,目的是利用工具輔助人工計算 1 純手動工具 結繩記事 算盤 計算尺 2 手動機械工具 帕斯卡的滾輪式加法器 雅卡爾提花織布機 可程式設計化是通用計算機的重要定義,即只要變更指令的儲存序列,通用計算機就能模擬其它形式...