(筆記整理)Python 多執行緒

2021-10-02 11:54:25 字數 4257 閱讀 2427

通過使用threading.thread建立乙個新的執行緒

==#如果子執行緒開啟以後,後面的**就會直接執行了,不會等子執行緒執行完

#只要子執行緒內的函式執行完,那麼子執行緒就結束

#開啟是.start開啟我們的週期

#只要子執行緒不死,主線程一都在==

以下是最基本的多執行緒使用,包含傳參。

# coding=utf-8

import threading

from time import sleep

defsing

(name)

:for i in

range(3

):print

("正在唱:%s...%d"

%(name, i)

) sleep(1)

defdance

(name, age)

:for i in

range(3

):print

("%s正在跳舞,年齡:%d ... %d"

%(name, age, i)

) sleep(1)

if __name__ ==

'__main__'

:print

('---開始---'

)# 傳參必須要是乙個元組,可以使用args=或者kwargs=

t1 = threading.thread(target=sing, args=

("我愛你祖國",)

) t2 = threading.thread(target=dance, args=

("小蔣",18

))t1.start(

) t2.start(

)

# coding=utf-8

import threading

from time import sleep

# 複寫多執行緒就是複寫其run()方法

# 如果需要傳入引數,就複寫__init__()方法,但需注意,還要複寫threading.thread.__init__(self)

class

mysing

(threading.thread)

:def

__init__

(self, name)

: threading.thread.__init__(self)

self.name = name

defrun(self)

:for i in

range(3

):print

("正在唱:%s...%d"

%(self.name, i)

) sleep(1)

class

mydance

(threading.thread)

:def

__init__

(self, name, age)

: threading.thread.__init__(self)

self.name = name

self.age = age

defrun(self)

:for i in

range(3

):print

("%s正在跳舞,年齡:%d ... %d"

%(self.name, self.age, i)

) sleep(1)

defmain()

:print

('---開始---'

) t1 = mysing(

"我愛我的祖國"

) t2 = mydance(

"小蔣",18

) t1.start(

) t2.start(

)if __name__ ==

'__main__'

: main(

)

threading模組中定義了lock類,可以方便的處理鎖定:

建立鎖mutex = threading.lock()

#鎖定mutex.acquire()

釋放mutex.release()

注意,鎖的範圍應該是盡量小的進行保護資料的計算,因為鎖產生等待,如果鎖的範圍過大,就會浪費很多時間,合理考慮鎖的範圍

# coding=utf-8

# 兩個執行緒修改同乙個全域性變數

# 定義乙個修改變數的方法

# 定義第二個修改變數的方法

# 全域性變數

import threading

import time

# 建立乙個鎖

lock = threading.lock(

)# lock2 = threading.lock() #使用鎖用同一把,保護2個執行緒共享的乙個變數,兩把鎖就沒有鎖的意義了。

num =

0# 這個寫資料1

defwrite1()

:global num

for temp in

range

(1000000):

# 上鎖

lock.acquire(

) num +=

1# 解鎖

lock.release(

)# 這個寫資料2

defwrite2()

:global num

for temp in

range

(1000000):

# 上鎖

lock.acquire(

) num +=

1# 解鎖

lock.release(

)def

main()

:"""我們建立兩個子執行緒去修改同乙個變數"""

threading.thread(target=write1)

.start(

) threading.thread(target=write2)

.start(

) time.sleep(10)

# 保證我們的子執行緒執行完

print

(num)

if __name__ ==

'__main__'

: main(

)

使用鎖需要注意,鎖只能有一把,誰有鎖誰才能操作。當然,使用鎖還需要在**中考慮不要產生死鎖,在可能產生死鎖的地方提前解鎖。

python多執行緒與多程序中join()方法的效果是相同的。

首先需要明確幾個概念:

知識點一:

當乙個程序啟動之後,會預設產生乙個主線程,因為執行緒是程式執行流的最小單元,當設定多執行緒時,主線程會建立多個子執行緒,在python中,預設情況下(其實就是setdaemon(false)),主線程執行完自己的任務以後,就退出了,此時子執行緒會繼續執行自己的任務,直到自己的任務結束,例子見下面一。

知識點二:

當我們使用setdaemon(true)方法,設定子執行緒為守護執行緒時,主線程一旦執行結束,則全部執行緒全部被終止執行,可能出現的情況就是,子執行緒的任務還沒有完全執行結束,就被迫停止,例子見下面二。

知識點三:

此時join的作用就凸顯出來了,join所完成的工作就是執行緒同步,即主線程任務結束之後,進入阻塞狀態,一直等待其他的子執行緒執行結束之後,主線程在終止,例子見下面三。

def

main()

: th =

for i in

range(5

):(arg1,arg2)

)for t in th:

t.setdaemon(

true

) t.start(

)for t in th:

t.join(

)# 這裡如果沒有join則主線程結束就整體結束,加個join就是讓主線程阻塞等待子執行緒全部結束再結束整個程式

知識點四:

join有乙個timeout引數:

當設定守護執行緒時,含義是主線程對於子執行緒等待timeout的時間將會殺死該子執行緒,最後退出程式。所以說,如果有10個子執行緒,全部的等待時間就是每個timeout的累加和。簡單的來說,就是給每個子執行緒乙個timeout的時間,讓他去執行,時間一到,不管任務有沒有完成,直接殺死。

沒有設定守護執行緒時setdaemon(false),主線程將會等待timeout的累加和這樣的一段時間,時間一到,主線程結束,但是並沒有殺死子執行緒,子執行緒依然可以繼續執行,直到子執行緒全部結束,程式退出。

python多執行緒筆記

顯示當前有幾條執行緒 print threading.active count 顯示具體的程序名 print threading.enumerance 顯示當前正在執行的執行緒 print threading.current thread 新增新的執行緒名add thread threading.t...

多執行緒整理01 多執行緒概述

什麼是程式?程式是一段由作業系統執行的 什麼是程序?程序是程式執行的過程,或者說正在被執行的一道程式,乙個程序由乙個或者多個執行緒組成 什麼是執行緒?執行緒是程序的執行部分,每個執行緒都有各自的堆疊空間,堆疊是私有的,而執行緒共享程序內的其他資源 什麼是併發和並行 併發 如果只有單個cpu的話,程式...

python多執行緒 python多執行緒

通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...