06多核 多程序 多執行緒

2022-06-18 03:54:11 字數 2784 閱讀 6062

實現平行計算有三種方式,多執行緒,多程序,多程序+多執行緒。

多核心(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,記憶體等計算機資源 有一定的生命週期 同乙個程式,每次執行都是不同的程序,因為...