程序和執行緒的區別及相關

2022-04-02 13:07:10 字數 3421 閱讀 1925

什麼是程序(process)?

乙個程式可執行的例項叫做乙個程序。(程序是資源的集合)

每乙個程序提供執行這個程式所需的資源,乙個程序有乙個虛擬的記憶體位址空間,可執行的**,呼叫的作業系統的接頭,安全的上下文(許可權)

唯一的程序識別符號pid,乙個優先順序類,最小和最大的工作記憶體空間,程序執行至少需要乙個執行緒,(當提供乙個程序的時候,至少提供乙個執行緒),程序中的第乙個執行緒通常被稱為主線程,但主線程也可以建立額外的執行緒(子執行緒,子執行緒也可以建立子執行緒,二者沒有遞屬關係)。

程序和執行緒的區別?

執行緒比程序啟動快,但是二者的執行速度沒有可比性。

1.執行緒共享記憶體空間,程序之間的記憶體空間是獨立的。

2.兩個執行緒可以直接訪問乙個程序的資料,共享記憶體空間。多個子程序之間的資料不會共享,對於相同資料,他們會copy父程序的,相互之間完全獨立。

3.乙個程序的多個執行緒之間可以直接進行互動,(涉及到資料的共享,資訊的傳遞等)。倆個程序想通訊,必須通過乙個中間**來實現。

4.新的執行緒很容易建立,建立新程序需要 對其父程序進行一次轉殖。

5.乙個執行緒可以控制和操作同一程序裡的其他執行緒,但是乙個程序只能操作它的子程序。

6.對於主線程修改,有可能會影響到其他執行緒的行為(因為其共享資料),對於父程序的修改不會影響其他子程序的資料(但是父程序刪除,子程序會受到影響)

主線程和它啟動的子執行緒是並行的,計算時間時,沒有時間序列(依次順序)關係。 

為了更好的理解:

1.理解併發

1

import

threading

2import

time34

defrun(n):

5print("

task

",n)

6 time.sleep(2)78

#執行緒使兩個程式併發執行,總共等待2秒

9 t1 = threading.thread(target=run,args=("t1"

,))10 t2 = threading.thread(target=run,args=("t2"

,))11

t1.start()

12t2.start()

1314#對比

15#二者序列執行,共4秒時間16#

run('t1')17#

run('t2')

2.# 繼承式呼叫,類的形式實現併發
1

#繼承式呼叫,類的形式實現併發

2import

threading

3import

time45

class

mythread(threading.thread):

6def

__init__

(self, n,sleep_time):

7 super(mythread,self ).__init__

()8 self.n =n

9 self.sleep_time =sleep_time

1011

defrun(self):

12print("

running task

", self.n)

13time.sleep(self.sleep_time)

14print('

task done

',self.n)

1516 t1 = mythread('

t1',2)

17 t2 = mythread('

t2',4)#

t1和t2的sleep時間不一致,計算main thread的時間,則二者均需要join

1819

t1.start()

20t2.start()

2122

t1.join()

23t2.join()

2425

print('

main thread has ...

')

3.for迴圈實現多併發

主線程和其啟動的子執行緒是並行的,二者並無執行完畢的先後順序。

不加join時,主線程不會等待子執行緒完成後再往下執行

1

import

threading

2import

time34

defrun(n):

5print("

task

",n)

6 time.sleep(2)

7print('

task done

', n)

8print("

------ threads has finished..

", threading.current_thread()) #

當前執行的執行緒型別910

11 start_time =time.time()12#

for 迴圈實現多併發

13 t_objs = #

存執行緒例項

14for i in range(50):

1516 t = threading.thread(target=run,args=("

t-%s

" %i,))

1718 t.setdaemon(true) #

把當前執行緒設定為守護執行緒

1920

t.start()

21為了不阻塞後面的執行緒啟動,不在這裡join,先放到乙個列表裡面23#

24#for t in t_objs: # 迴圈執行緒例項列表,等待所有執行緒執行完畢25#

t.join()

2627

print("

------all threads has finished..

",threading.current_thread(),threading.active_count()) #

檢視當前執行緒的型別和活躍個數

28print('

cost:

', time.time() -start_time)

2930#對比

31#run('t1')32#

run('t2')

守護執行緒:

將所有的子執行緒程式設計守護執行緒:即主線程不會等待所有子程式完成後退出,只要主線程執行完畢,就可以退出。

主程式不會等待主線程結束後退出,它會等待非守護執行緒結束後才退出,程式不會理會守護執行緒。

守護執行緒應用場景:socket server設定

多核:同時可以執行多個執行緒。

但是在python中,同一時間只能執行乙個執行緒。python直譯器直接呼叫c語言的執行緒介面,僅把上下文傳遞。執行緒執行過程中,python無法控制讓哪個執行緒先執行

。故在直譯器出口控制,同一時間,只允許乙個執行緒工作,也只允許乙個執行緒得到資料。(新增全域性直譯器鎖)(cpython)

執行緒和程序的區別

易於排程。執行緒切換比程序切換要快。虛擬記憶體空間,io裝置等 開銷小。建立執行緒比建立進行要快,所需開銷小。進展用少量資源,如棧和暫存器。提高併發性。程序可以建立多個執行緒來執行統一程式的不同任務。有利於充分發揮多處理器的功能。通過建立多執行緒的程序,每個執行緒在乙個處理器上執行,從而實現了應用程...

執行緒和程序的區別

這個問題我查了不下4次,每次都是突然想到查一下,當時明白,完了又會混淆 首先我們知道 程序 執行緒 執行緒 在乙個程式裡面的多個任務,比如賣票系統,他有退票和賣票的功能,我們就可以給他稱之為執行緒。程序 我們開啟任務管理器可以看到的是我們在系統上執行的程式稱之為執行緒 總之,乙個程式必須有乙個程序,...

執行緒和程序的區別

1.計算機的核心是cpu,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。2.假定工廠的電力有限,一次只能供給乙個車間使用。也就是說,乙個車間開工的時候,其他車間都必須停工。背後的含義就是,單個cpu一次只能執行乙個任務。3.程序就好比工廠的車間,它代表cpu所能處理的單個任務。任一時刻,cpu...