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 ...