python多线程编程_Python 多线程编程
Thread類
classThread:def __init__(self,group=None,target=None,name=None,args=(),kwargs=None,*,daemon=None)
group:None,為日后擴展 ThreadGroup 類實現而保留。
target:run() 方法調用的目標函數。
name:線程名。默認值為Thread-N。
args:傳遞給目標函數的位置參數元組。
kwargs:傳遞給目標函數的關鍵字參數字典。
daemon:守護線程。
Thread類的常用方法和屬性
start():啟動線程,在一個線程里最多只能被調用一次。
run():調用 target 傳遞的目標函數,并從?args?和?kwargs?分別獲取的位置和關鍵字參數。
name:線程名。
getName():獲取線程名。
setName():設置線程名。
ident:線程標識符,是個非零整數。如果線程尚未啟動則為None。
daemon:是否是守護線程的布爾值,默認為False。
isDaemon():返回線程是否是守護線程。
setDaemon():設置線程為守護線程。
join([time]):阻塞調用該方法的線程,直到被調用該方法的線程結束或超時。
is_alive():返回線程是否存活。
threading模塊常用方法和屬性
active_count():返回當前存活的 Thread 對象的計數。
enumerate():以列表形式返回當前存活的 Thread 對象。
current_thread():返回當前對應調用者的控制線程的 Thread 對象。
main_thread():返回主 Thread 對象。
get_ident():返回當前線程的"線程標識符"。
創建線程
可調用對象傳遞給構造函數
重寫子類的 run() 方法
1.?可調用對象傳遞給構造函數
importthreadingimporttimedeffunc(n):print("task", n)
time.sleep(2)for i in range(2):
t= threading.Thread(target=func, args=(i,)) #創建線程
t.start() #啟動線程
2.?重寫子類的 run() 方法
importthreadingimporttimeclassMyThread(threading.Thread):def __init__(self, n):
super().__init__()
self.n=ndefrun(self):print("task", self.n)
time.sleep(2)for i in range(2):
t=MyThread(i)
t.start()
全局解釋器鎖
全局解釋器鎖(Global Interpreter Lock,簡稱GIL),是計算機程序設計語言解釋器用于同步線程的工具,使得在同一進程內任何時刻僅有一個線程在執行。即使在多核CPU平臺上,同一時刻也只有一個獲得GIL的線程在執行,其他線程處于阻塞狀態。
CPython使用操作系統的原生線程,由操作系統負責調度。
每個解釋器進程有唯一的主線程和用戶定義的任意數量子線程。
每個解釋器進程有且僅有一個GIL,當解釋器啟動時,主線程獲取GIL。
線程執行前要先獲取GIL,當遇到I/O操作時釋放GIL。
線程鎖
原始鎖處于"鎖定"或者"非鎖定"狀態,被創建時是非鎖定狀態。它有兩個基本方法:acquire(),release()。
當狀態是非鎖定時,線程調用 acquire() 獲取鎖,并阻塞其他線程,直到鎖被釋放,將狀態修改為鎖定。
當狀態是鎖定時,任何線程都可以調用 release() 釋放鎖,將狀態修改為非鎖定。
importthreadingimporttime
lock=threading.Lock()deffunc(n):
lock.acquire()#獲取鎖
print("task", n)
lock.release()#釋放鎖
time.sleep(2)for i in range(2):
t= threading.Thread(target=func, args=(i,))
t.start()
信號量
信號量管理一個內部計數器,調用 acquire() 方法時計數器-1,調用 release() 方法時計數器+1。當計數器為0時將會阻塞,直到線程調用 release() 方法。
importthreadingimporttime
semaphore= threading.BoundedSemaphore(2)deffunc(n, se):
se.acquire()print("task", n)
time.sleep(2)
se.release()for i in range(2):
t= threading.Thread(target=func, args=(i,semaphore))
t.start()
事件
事件是線程之間的一種通信機制:一個線程發出事件信號,其他線程等待該信號。
事件對象管理一個內部標志Flag,初始為false。調用 set() 方法可將其設置為 true,調用 clear()?方法可將其設置為false,調用 wait() 方法將阻塞線程直到標志為 true。
importthreadingimporttime
event=threading.Event()deffunc():print(threading.current_thread().getName(), "ready")
time.sleep(3)
event.wait()print(threading.currentThread().getName(), "go")for i in range(2):
t= threading.Thread(target=func)
t.start()print("Ready?Go!")
event.set()
總結
以上是生活随笔為你收集整理的python多线程编程_Python 多线程编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 文件指针在文件末尾_pyt
- 下一篇: python如何移动图片_python之