實現平行計算有三種方式,多執行緒,多程序,多程序+多執行緒。多核心(multicore chips)是指在一枚處理器(chip)中整合兩個或多個完整的計算引擎(核心),
計算機的cpu物理核數是同時可以並行的執行緒數量(cpu只能看到執行緒,執行緒是cpu排程分配的最小單位),
乙個核只能執行乙個執行緒。
程序是作業系統資源分配(記憶體,顯示卡,磁碟)的最小單位,
執行緒是執行排程(即cpu排程)的最小單位(cpu看到的都是執行緒而不是程序),
乙個程序可以有乙個或多個執行緒,執行緒之間共享程序的資源,
通過這樣的正規化,就可以減少程序的建立和銷毀帶來的代價,可以讓程序少一點,保持相對穩定,不斷去排程執行緒就好。
多執行緒指的是,在乙個程序中開啟多個執行緒,
簡單的講:如果多個任務共用一塊位址空間,那麼必須在乙個程序內開啟多個執行緒。詳細的講分為4點:
1. 多執行緒共享乙個程序的位址空間(資料),乙個程序內的多個執行緒的pid一樣
2. 執行緒比程序更輕量級,執行緒比程序更容易建立可撤銷,在許多作業系統中,建立乙個執行緒比建立
乙個程序要快10-100倍,在有大量執行緒需要動態和快速修改時,這一特性很有用
3. 若多個執行緒都是cpu密集型的,那麼並不能獲得效能上的增強,但是如果存在大量i/o處理,
擁有多個執行緒允許這些活動彼此重疊執行,從而會加快程式執行的速度。
4. 在多cpu系統中,為了最大限度的利用多核,可以開啟多個執行緒,比開程序開銷要小的多。
(這一條並不適用於python)
1.單核多執行緒,併發,不是並行
1.多核多執行緒,執行緒數《核數,並行
1.多核多執行緒,執行緒數》核數,併發,(其中有些執行緒就會不斷切換,併發執行,但實際上最大的並行數量還是當前這個程序中的核的數量,
所以盲目增加執行緒數不僅不會讓你的程式更快,反而會給你的程式增加額外的開銷。)
關於效率:
任務可以分為計算密集型和io密集型:
io密集型:有阻塞的狀態,就是一直會執行cpu(中間就乙個等待狀態,這個就叫做io密集型)。例如:sleep狀態
計算密集型任務:沒有等待的狀態就是計算密集型,從上到下執行沒有等待。
在python中沒法同時使用多個cpu,在同一時刻,多個執行緒是互相搶占資源的,在cpython執行中加了一把鎖(gil)。
如果任務是io密集型的可以使用多執行緒(阻塞等待時,就是放gil,給另乙個執行緒執行的機會,併發)
如果是計算密集型任務時,無法使用多執行緒(如果遇到cpu密集型的執行緒,乙隻占用cpu,不會被i/o阻塞)
計算密集型:多程序效率高,如金融分析
io密集型:多執行緒效率高,如socket,爬蟲,web
效能測試
#計算密集型
from multiprocessing import
process
from threading import
thread
import
time, os
deftask():
res = 1
for i in range(100000000):
res *=i
if__name__ == '
__main__':
start_time =time.time()
print(os.cpu_count()) #
本機為4核
l =for i in range(4):
#p = process(target=task) #spend_time: 16.10278034210205,計算密集型,多程序效率高
p = thread(target=task) #
spend_time: 26.059650897979736
p.start()
for p in
l: p.join()
end_time =time.time()
print('
spend_time:
',end_time-start_time)
#i/o密集型
from multiprocessing import
process
from threading import
thread
import
time, os
deftask():
time.sleep(2)
print('
------->')
if__name__ == '
__main__':
start_time =time.time()
print(os.cpu_count()) #
本機為4核
l =for i in range(400):
#p = process(target=task) #spend_time: 30.915207862854004
p = thread(target=task) #
spend_time: 2.059750556945801,i/o密集型,多執行緒效率高
p.start()
for p in
l: p.join()
end_time =time.time()
print('
spend_time:
',end_time-start_time)
python多執行緒 多程序 多核
cpython的gil會限制執行的python執行緒的數量,所有就python 來說多執行緒最多只能使用乙個核,但是gil並不會限制c執行緒的數量,所以python中嵌入c 或者網路io 呼叫核心c 是可以實現多核的,所有python可以作為伺服器端 如果要做密集計算,可以用多程序,或者換jpyth...
多執行緒 多程序?
這幾天在思考如何改進原型在多個客戶端的情況下的效能,特地溫習了一下多程序和多執行緒的一些知識。在linux下程序的程序和執行緒在核心看來區別很小,都是乙個可排程單元,都擁有記憶體管理結構等等。但是關鍵的差別是程序的資源都是私有的,而執行緒則是和別人共享的,所以執行緒的上下文切換可能比程序的開銷要小很...
多程序,多執行緒
多工程式設計 通過應用程式利用多個計算機核心達到多工同時執行的 目的,從此來提公升程式執行效率 多程序,多執行緒 程序 程式在計算機中一次執行的過程 程式 靜態的描述,不占有計算機資源 程序 是乙個動態的過程,占有cpu,記憶體等計算機資源 有一定的生命週期 同乙個程式,每次執行都是不同的程序,因為...