python3中的執行緒簡記

2022-07-28 03:30:17 字數 3210 閱讀 3096

python3中的多執行緒

1、優點:

1)使用執行緒可以把佔據長時間的程式中的任務放到後台去處理。

2)使用者介面更好,執行速度快(不絕對)。

3)在一些等待性的任務實現上:如使用者輸入,檔案讀寫,網路收發資料等,運用執行緒可以通過釋放記憶體緩解記憶體占用過高的問題。

2、每個獨立的執行緒有乙個程式執行的入口,順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

3、每個執行緒都有他自己的一組cpu暫存器,稱為執行緒的上下文,該上下文反映了執行緒上次執行該執行緒的cpu暫存器的狀態。

4、指令指標和堆疊指標暫存器是執行緒上下文中兩個最重要的暫存器,執行緒總是在程序的上下文中執行的,這些位址都用於標誌擁有執行緒的程序位址空間中的記憶體。

5、執行緒可以分為:

核心執行緒:由作業系統核心建立和撤銷。

使用者執行緒:不需要核心支援而在使用者程式中實現的執行緒。

6、執行緒模組:python3通過兩個標準庫_thread和threading提供對執行緒的支援。_thread提供了低階別的、原始的執行緒以及乙個簡單的鎖,它相比於 threading 模組的功能還是比較有限的。threading 模組除了包含 _thread 模組中的所有方法外,還提供的其他方法:

1)threading.currentthread(): 返回當前的執行緒變數。

2)threading.enumerate(): 返回乙個包含正在執行的執行緒的list。正在執行指執行緒啟動後、結束前,不包括啟動前和終止後的執行緒。

3)threading.activecount(): 返回正在執行的執行緒數量,與len(threading.enumerate())有相同的結果。

除了使用方法外,執行緒模組同樣提供了thread類來處理執行緒,thread類提供了以下方法:

1)run(): 用以表示執行緒活動的方法。

2)start():啟動執行緒活動。

3)join([time]):等待至執行緒中止。這阻塞呼叫執行緒直至執行緒的join()方法被呼叫中止-正常退出或者丟擲未處理的異常-或者是可選的超時發生。

4)isalive(): 返回執行緒是否活動的。

5)getname(): 返回執行緒名。

6)setname(): 設定執行緒名。

使用threading模組建立執行緒:

import threading

class mythread (threading.thread):

def __init__(self,引數1,引數2,引數3...):

threading.thread.__init__(self)

...def run(self):

pass

建立新的執行緒:這裡mythread()的引數跟類定義的引數是一致的

thread1 = mythread(引數1,引數2,引數3...)

開啟新的執行緒:

thread1.start()

等待執行緒至終止

thread1.join()

7、執行緒同步:使用thread物件的lock和rlock可以實現簡單的執行緒同步,這兩個物件都有acquire方法和release方法,對於那些需要每次只允許乙個執行緒操作的資料,可以將其操作放到 acquire 和 release 方法之間。

8、執行緒優先順序佇列:python的queue模組中提供了同步的、執行緒安全的佇列類:fifoqueue,lifoqueue,priorityqueue.這些佇列都實現了鎖原語,能夠在多執行緒中直接使用,可以使用佇列來實現執行緒間的同步。

加鎖和佇列(加鎖)的原理基本一致:都是保證乙個先後順序,不會出現交叉處理,避免不一致的情況發生。

來看乙個例項:

import queue

import threading

import time

exitflag = 0

class mythread (threading.thread):

def __init__(self, threadid, name, q):

threading.thread.__init__(self)

self.threadid = threadid

self.name = name

self.q = q

def run(self):

print ("開啟執行緒:" + self.name)

process_data(self.name, self.q)

print ("退出執行緒:" + self.name)

def process_data(threadname, q):

while not exitflag:

if not workqueue.empty():

data = q.get()#執行緒優先佇列中是沒有出隊函式的,這個get():獲取佇列,應該就算是出隊的了。

print ("%s processing %s" % (threadname, data))

time.sleep(1)

threadlist = ["thread-1", "thread-2", "thread-3"]

namelist = ["one", "two", "three", "four", "five"]

workqueue = queue.queue(10)

threads =

threadid = 1

# 填充佇列

for word in namelist:

workqueue.put(word)

# 建立新執行緒

for tname in threadlist:

thread = mythread(threadid, tname, workqueue)

thread.start()

threadid += 1

# 等待佇列清空

while not workqueue.empty():

pass

# 通知執行緒是時候退出

exitflag = 1

# 等待所有執行緒完成

for t in threads:

t.join()

print ("退出主線程")

輸出:

python3 執行緒的停止

1 threading類 設定子執行緒為守護執行緒,setdaemon true 當主線程結束時,守護執行緒會自動結束 import threading def run x while x print x t threading.thread target run,args 4,daemon tru...

Python3多執行緒

學習python執行緒 python3 執行緒中常用的兩個模組為 thread threading 推薦使用 thread 模組已被廢棄。使用者可以使用 threading 模組代替。所以,在 python3 中不能再使用 thread 模組。為了相容性,python3 將 thread 重新命名為...

python3 執行緒死鎖

所謂死鎖 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序,如下就是死鎖 code from threading import thread,lock ...