二十九 執行緒與多執行緒

2022-03-22 04:40:32 字數 4543 閱讀 4335

一、執行緒定義及作用

執行緒:程序執行緒其實都是虛擬單位,都是用來幫助我們形象的描述某種事物

程序:資源單位(程序開闢一塊記憶體空間,裡面可以有多個執行緒)

執行緒:執行單位(程序的任務都是執行緒去執行)

將記憶體比如成工廠

那麼程序就相當於是工廠裡面的車間

而你的執行緒就相當於是車間裡面的流水線

提供**執行所需要的資源

執行緒的作用:

開程序:

1.申請記憶體空間 耗資源

2."拷貝**" 耗資源

開執行緒

乙個程序內可以起多個執行緒,並且執行緒與執行緒之間資料是共享

ps:開啟執行緒的開銷要遠遠小於開啟程序的資源占有

比如:乙個程序在執行過程中遇到阻塞,要麼只能等待,

要麼就需要多啟動乙個程序去執行提高運算速度,

這時候 執行緒 就可以在不多開啟程序的情況下,非同步去執行其他**,提高效率

(程序在同一時間只能幹一件事,要想同時幹幾件事就顯得無能為力)

注意:程序是資源分配的最小單位,執行緒是cpu排程的最小單位

每乙個程序中至少有乙個執行緒

二、建立執行緒的兩種方式

from threading import

thread

import

time

deftask(name):

print('

%s is running

' %name)

time.sleep(3)

print('

%s is over

' %name)

#開執行緒不需要在__main__**塊內 但是習慣性的還是寫在__main__**塊內

t = thread(target=task, args=('

egon

',))

t.start()

#告訴作業系統開闢乙個執行緒 執行緒的開銷遠遠小於程序

#小的**執行完 執行緒就已經開啟了

print('主'

)"""

第二種方法:

from threading import thread

import time

class mythread(thread):

def __init__(self, name):

super().__init__()

self.name = name

def run(self):

print('%s is running' % self.name)

time.sleep(3)

print('%s is over' % self.name)

t = mythread('egon')

t.start()

print('主')

就是繼承thread得來

"""

三、執行緒物件及其他方法

子執行緒與子執行緒,主線程都是非同步(同時)執行,並且都是同乙個程序
from threading import

thread, current_thread, active_count

import

time, os

deftask(name, i):

print("

%s is runing

" %name)

print("

子執行緒名字:

", current_thread().name) #

子執行緒名字

print("

子執行緒程序:

", os.getpid())

time.sleep(1)

print("

%s is over

" %name)

# active_count() 當前活躍執行緒數:

#current_thread().name 執行緒名字(是主線程或子執行緒名字)

# os.getpid()查詢程序數

t1 = thread(target=task, args=("

engon

", 1,))

t2 = thread(target=task, args=("

tank

", 2,))

t1.start()

t2.start()

#t1.join()

#t2.join() #等待子執行緒結束

print("

當前正在活躍的執行緒數:

", active_count())

print("

主線程名字:

", current_thread().name) #

print("

主線程程序:

", os.getpid())

#只要不是子執行緒,都是主線程

四、守護執行緒

主線程的結束也就意味著程序的結束主線程必須等待其他非守護執行緒的結束才能結束

(意味子執行緒在執行的時候需要使用程序中的資源,而主線程一旦結束了資源也就銷毀了)

from threading import

thread, current_thread

import

time

deftask(i):

print

(current_thread().name)

time.sleep(i)

print('gg'

)#for i in range(3):

#t = thread(target=task,args=(i,))

#t.daemon = true

#t.start()

t = thread(target=task, args=(1,))

t.daemon = true #

開啟子執行緒守護執行緒

t.start()

print('

主')

五、執行緒之間的通訊

同乙個程序裡,所有執行緒的資料都是共享的,因為都在同乙個記憶體空間(程序開闢的空間)
from threading import

thread

money = 666

deftask():

global

money

money = 777t = thread(target=task)

t.start()

t.join()

print(money) #777

六、執行緒鎖(互斥鎖)

執行緒鎖:和程序鎖使用方法一樣,開啟多執行緒中會存在資料不安全(多個執行緒搶同乙個資料)
from threading import

thread, lock

import

time

n = 100

deftask(mutex):

global

n mutex.acquire()

tmp =n

time.sleep(0.1)

n = tmp - 1mutex.release()

t_list =

mutex =lock()

for i in range(100):

t = thread(target=task, args=(mutex,))

t.start()

for t in

t_list:

t.join()

print(n) #0#

100個執行緒非同步去執行task(),拿到鎖以後乙個乙個執行,保證資料安全

from threading import

thread

import

time

deffoo():

print(123)

time.sleep(1)

print("

end123")

defbar():

print(456)

time.sleep(3)

print("

end456")

if__name__ == '

__main__':

t1 = thread(target=foo)

t2 = thread(target=bar)

t1.daemon =true

t1.start()

t2.start()

print("

main-------

")

小練習

第二十九章 基元執行緒同步構造

目錄 29.1 類庫和執行緒安全 29.2 基元使用者模式和核心模式構造 29.3 使用者模式構造 29.4 核心模式構造 執行緒同步 多個執行緒同時訪問共享資料時,執行緒同步能防止資料損壞。繁瑣 在 中,必須標識出所有可能由多個執行緒同時訪問的資料。然後,必須用額外的 將這些 包圍起來,並獲取和釋...

黑板模式(二十九)

黑板模式 blackboarddesignpattern 是觀察者模式的乙個擴充套件,知名度並不高,但是我們使用的範圍卻非常廣。黑板模式的意圖如下 允許訊息的讀寫同時進行,廣泛地互動訊息。簡單地說,黑板模式允許多個訊息讀寫者同時存在,訊息的生產者和消費者完全分開。這就像乙個黑板,任何乙個教授 訊息的...

二十九 直譯器模式

直譯器模式 interpreter 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。知識點 字串匹配,判斷email,匹配 號碼等等。正規表示式就是直譯器模式的一種應用。直譯器模式容易的改變和擴充套件方法。直譯器模式為文法中的每一條規則至少定義了乙個類...