日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python多线程编程_Python 多线程编程

發布時間:2023/12/10 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 多线程编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。