Python多线程(1)——介绍
Python對多線程提供了很好的支持,Python中多線程相關的模塊包括:thread,threading,Queue。可以方便地支持創建線程、互斥鎖、信號量、同步等特性。
1.?thread:多線程的底層支持模塊,除了其中提供的 Lock 原語外,一般不建議使用。
2.?threading:基于 thread 模塊,將一些線程的操作對象化,該模塊提供下列類:
-
- Thread,線程類
- Timer,與Thread類似,但要等待一段時間后才開始運行
- Lock,鎖原語,和 thread 模塊提供的 Lock 相同
- RLock,可重入鎖。使單線程可以再次獲得已經獲得的鎖
- Condition,條件變量,能讓一個線程停下來,等待其他線程滿足某個“條件”
- Event,通用的條件變量。多個線程可以等待某個事件發生,在事件發生后,所有的線程都被激活
- Semaphore,為等待鎖的線程提供一個類似“等候室”的結構
-
Queue隊列
-
LifoQueue后入先出(LIFO)隊列
-
PriorityQueue 優先隊列
?
Python線程系列包括以下部分:
第1篇——Thread對象
第2篇——常用的線程同步機制
第3篇——Queue模塊與線程編程
本文將介紹Python線程中的主角,threading.Thread 對象。
?
Thread in Python
1.1 Thread對象的創建
通過實例化Thread類型獲得一個Thread對象:
threading.Thread(name=None, target=None, args=(), kwargs={})參數的含義:
- name:新線程的名稱,如果沒有指定,python會為其生成一個隨機的唯一名稱;
- target:新線程中將要執行的函數;t.run() 會調用 target(*args, **kwargs)
- args和kwargs:這是傳遞給線程中運行的主函數 target 的參數,當線程開始運行時,將會以這些參數調用執行主函數 target()。
?
1.2 Thread對象的方法
t.getName()返回線程當前的名字。
t.setName(name)
設置線程的名字,線程的名稱并不要求唯一。
t.isAlive()
判斷這個線程是否還在運行中(active)——已經調用了start() 而 run() 還沒有執行結束。
?
t.isDaemon()判斷線程是不是一個daemon線程,初始狀態下,線程 t1 只有在創建自己的線程 t0 是daemon時,自己才是daemon的。
?
t.setDaemon(daemonic)把線程的daemon標志設為daemonic(真或假)
daemon 線程是指,即使這個線程 t 的狀態是 active,Python也可以終止 t(可能是通過終止 t 所在的進程);非daemon線程沒有終止前,Python會一直保持運行直到其終止。
setDaemon()需要在start()之前調用。
?
t.join(timeout=None)這個函數需要注意,比如在一個線程 t1 的執行流程中調用 t2.join(),則?t1 阻塞直到 t2 線程執行結束,如果指定 timeout,則 t1 最多阻塞timeout秒,否則 t1 將一直等下去。
join()只能在start()之后調用;
?
t.run()線程通過 run() 調用傳入的主函數 target,不要直接調用run(),而是調用start()函數,start()函數會調用run()。
?
t.start()開始線程執行
Python線程運行的流程
1. 創建一個線程 t= threading.Thread(),此時新創建的線程并不會立即執行;
2. 如果想要將 t 設置為守護線程,在調用 t.start() 之前調用 t.setDaemon(True);否則忽略本步;
3.?調用 t.start(),此時線程開始執行,狀態更新為 active。更具體的,start() 會進一步調用 run() 函數,run() 函數再去調用創建線程對象時傳入的主函數 target,從而讓線程有了執行的具體內容;
4. 當線程中的主函數執行完成或遇到未處理的異常時,線程終止執行;daemon線程也可能因為所在進程終止而被Python終止。
總結
以上是生活随笔為你收集整理的Python多线程(1)——介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重在参与吗。。。。。。。。
- 下一篇: switchhosts(本地域名解析)小