多道技術是基於單核背景下產生的
cpu 執行過程(單核):
cpu 同一時間只能執行乙個任務,這個任務不結束,不能執行其他任務
cpu 在執行a任務時,a任務發生了 io 操作或者是執行時間過長時,此時 cpu 可以將 a(儲存狀態)然後再切換去執行b任務。等到執行遇到'io操作或者執行時間過長時',再將 cpu 執行許可權交給 a,直到兩個任務都完成。
空間上的復用:
將記憶體劃分為多個片,可以執行多個程式
時間上的復用:
切換 + 儲存狀態
例子:洗衣服30s,做飯50s,燒水30s
單道需要110s,多道只需要任務做長的那乙個 切換節省時間
例子:邊吃飯邊玩遊戲 儲存狀態
1) 當執行程式遇到io時,作業系統會將cpu的執行許可權剝奪。
2) 當執行程式執行時間過長時,作業系統會將cpu的執行許可權剝奪。
1、併發:
在單核(乙個 cpu)情況下,當執行a,b 程式時,a 先執行,當 a 遇到 io 時,作業系統會將 a 程式狀態儲存並切換執行 b 程式,他們看起來像同時執行
併發是偽並行,即看起來是同時執行。單個cpu+多道技術就可以實現併發,(並行也屬於併發)
ps:在單核情況下,不能實現並行,只能實現併發(偽並行)
2、並行:
在多核(多個 cpu)的情況下,當執行a,b 程式時,a 與 b 同時執行,他們是真正意義上的同時執行
單核下,可以利用多道技術,多個核,每個核也都可以利用多道技術(多道技術是針對單核而言的)
有四個核,六個任務,這樣同一時間有四個任務被執行,假設分別被分配給了cpu1,cpu2,cpu3,cpu4,一旦任務1遇到i/o就被迫中斷執行,此時任務5就拿到cpu1的時間片去執行,這就是單核下的多道技術。而一旦任務1的i/o結束了,作業系統會重新呼叫它(需知程序的排程、分配給哪個cpu執行,由作業系統說了算),可能被分配給四個cpu中的任意乙個去執行
如圖所示:
程式與程序的區別
"""
程式就是一堆躺在硬碟上的**,是「死」的
程序則表示程式正在執行的過程,是「活」的
上述概念的組合:最高效的一種組合就是非同步非阻塞
定心丸:**開啟程序和執行緒的方式,**書寫基本是一樣的,你學會了如何開啟程序就學會了如何開啟執行緒
from multiprocessing import process
import time
def task(name):
print('%s is running'%name)
time.sleep(3)
print('%s is over'%name)
if __name__ == '__main__':
# 1 建立乙個物件
p = process(target=task, args=('jason',))
# 容器型別哪怕裡面只有1個元素 建議要用逗號隔開
# 2 開啟程序
p.start() # 告訴作業系統幫你建立乙個程序 非同步
print('主')
# 第二種方式 類的繼承
from multiprocessing import process
import time
class myprocess(process):
def run(self):
print('hello bf girl')
time.sleep(1)
print('get out!')
if __name__ == '__main__':
p = myprocess()
p.start()
print('主')
總結
"""
建立程序就是在記憶體中申請一塊記憶體空間將需要執行的**丟進去
乙個程序對應在記憶體中就是一塊獨立的記憶體空間
多個程序對應在記憶體中就是多塊獨立的記憶體空間
程序與程序之間資料預設情況下是無法直接互動,如果想互動可以借助於第三方工具、模組
"""
join是讓主程序等待子程序**執行結束之後,再繼續執行。不影響其他子程序的執行
from multiprocessing import process
import time
def task(name, n):
print('%s is running'%name)
time.sleep(n)
print('%s is over'%name)
if __name__ == '__main__':
# p1 = process(target=task, args=('jason', 1))
# p2 = process(target=task, args=('egon', 2))
# p3 = process(target=task, args=('tank', 3))
# start_time = time.time()
# p1.start()
# p2.start()
# p3.start() # 僅僅是告訴作業系統要建立程序
# # time.sleep(50000000000000000000)
# # p.join() # 主程序等待子程序p執行結束之後再繼續往後執行
# p1.join()
# p2.join()
# p3.join()
start_time = time.time()
p_list =
for i in range(1, 4):
p = process(target=task, args=('子程序%s'%i, i))
p.start()
for p in p_list:
p.join()
print('主', time.time() - start_time)
from multiprocessing import process
money = 100
def task():
global money # 區域性修改全域性
money = 666
print('子',money)
if __name__ == '__main__':
p = process(target=task)
p.start()
p.join()
print(money)
併發程式設計理論
併發 在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行,但任乙個時刻點上只有乙個程式在處理機上執行。簡言之,是指系統具有處理多個任務的能力。當系統有乙個以上cpu時,則執行緒的操作有可能非併發。當乙個cpu執行乙個執行緒時,另乙個cpu可以...
網路程式設計02 併發理論
import socket s socket.socket 建立網路傳輸,預設tcp協議 s.bind ip port 繫結ip 埠 s.listen 5 半連線池 sock,addr s.accept 監聽,三次握手的lisent態 sock.recv 1024 接收內容 sock.send 傳送...
python 併發程式設計理論部分
一,什麼是程序?程序 正在進行的乙個過程或者說乙個任務。而負責執行任務的則是cpu 舉例 單核 多道,實現多個程序的併發執行 egon在乙個時間段內有很多任務要做 python備課的任務,寫書的任務,交女朋友的任務,王者榮耀上分的任務,但egon同一時刻只能做乙個任務 cpu同一時間只能幹乙個活 如...