python?多線程threading程序詳情
CPython implementation detail: 在 CPython 中,由于存在全局解釋器鎖, 同一時刻只有一個線程可以執(zhí)行 Python 代碼(雖然某些性能導向的庫可能會去除此限制)。 如果你想讓你的應用更好地利用多核心計算機的計算資源,推薦你使用multiprocessing或concurrent.futures.ProcessPoolExecutor但是,如果你想要同時運行多個 I/O 密集型任務,則多線程仍然是一個合適的模型。
再來引入一個概念:
- 并行(parallelism): 是同一時刻,每個線程都在執(zhí)行。
- 并發(fā)(concurrency):是同一時刻,只有一個線程執(zhí)行,然后交替執(zhí)行(再加上電腦運行速度快)。所以從一個宏觀的角度來看,似乎每個線程都在執(zhí)行了。
可以知道python線程是并發(fā)的。
關(guān)于線程Threading的方法(獲取線程的某種屬性)。
- active_count():它會獲得,執(zhí)行這個方法時,還存活的Thread()的對象數(shù)量。
- enumerate():返回當前所有存活的Thread對象的列表。
- current_thread():返回當前調(diào)用者 控制Thread()線程的對象。如果調(diào)用者控制的線程對象不是由threading創(chuàng)建,則會返回一個功能受限的虛擬線程對象。
- get_ident():返回當前線程的“線程標識符”。它是一個非零整數(shù)。
- get_native_id():返回內(nèi)核分配給當前線程的原生集成線程ID。這是一個非負整數(shù)。
- main_thread():返回主線程(thread)對象,一般是python解釋器開始時創(chuàng)建的線程。
線程簡介:
Thread類表示在單獨的控制線程中運行的活動。指定活動有兩種方法:將可調(diào)用對象傳遞給構(gòu)造函數(shù),或重寫子類中的run()方法。子類中不應重寫任何其他方法(構(gòu)造函數(shù)除外)。換句話說,只重寫這個類的_init__;()和run()方法
一旦線程活動開始,該線程會被認為是 '存活的' 。當它的run() 方法終結(jié)了(不管是正常的還是拋出未被處理的異常),就不是'存活的'。
先看看該類的參數(shù)有哪些:
class threading.
Thread
(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
- group:官方的解釋是,為了日后擴展ThreadGroup類實現(xiàn)而保留。(唉,我也不太清楚的)
- target:是要于多線程的函數(shù)
- name:是線程的名字
- args :函數(shù)的參數(shù),類型是元組()
- kwargs:函數(shù)的參數(shù),類型是字典{}
為了便于理解,先舉一個小例子,為了方便理解,先簡單了解一下該類的一個方法(函數(shù)在類中被稱為方法):
- start():開始線程活動
import threading import time ? # 打印函數(shù)a def printa(a): ? ? count = 0 ? ? while count < 5: ? ? ? ? time.sleep(2) ? ? ? ? print("線程:%s。打印:%s。時間:%s。" % (threading.current_thread().name, a, time.ctime())) ? ? ? ? count += 1 ? # 打印函數(shù)b def printb(b): ? ? count = 0 ? ? while count < 5: ? ? ? ? time.sleep(4) ? ? ? ? print("線程:%s。打?。?s。時間:%s。" % (threading.current_thread().name, b, time.ctime())) ? ? ? ? count += 1 ? # threading.Thread(target=,args=(),name='') t1 = threading.Thread(target=printa, args=(10,), name='線程1') t2 = threading.Thread(target=printb, args=(20,), name='線程2') ? t1.start() t2.start() ? t1.join() t2.join() ? print("退出主線程")
import threading import time ? # 打印函數(shù)a def printa(a): ? ? count = 0 ? ? while count < 5: ? ? ? ? time.sleep(2) ? ? ? ? print("線程:%s。打印:%s。時間:%s。" % (threading.current_thread().name, a, time.ctime())) ? ? ? ? count += 1 ? # threading.Thread(target=,args=(),name='') threadList = [] for i in range(3): ? ? t = threading.Thread(target=printa, args=(i,)) ? ? threadList.append(t) ? for t in threadList: ? ? t.start() ? for t in threadList: ? ? t.join() ? ?? print("退出主線程")
到此這篇關(guān)于python 多線程threading程序詳情的文章就介紹到這了,更多相關(guān)python 多線程threading內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 中使用 argparse 解析命令行參數(shù)
這篇文章主要介紹了Python 中使用 argparse 解析命令行參數(shù),argparse 模塊是一個強大的命令行參數(shù)解析器,還有很多功能沒能在這里介紹。下面文化在哪個詳細介紹該內(nèi)容,需要的朋友可以參考一下2021-11-11詳解如何利用pandas進行數(shù)據(jù)行轉(zhuǎn)列和列轉(zhuǎn)行
這篇文章主要為大家詳細介紹了如何利用pandas進行數(shù)據(jù)行轉(zhuǎn)列和列轉(zhuǎn)行,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2007-02-02淺談python中字典append 到list 后值的改變問題
今天小編就為大家分享一篇淺談python中字典append 到list 后值的改變問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05關(guān)于python3.9安裝wordcloud出錯的問題及解決辦法
這篇文章主要介紹了關(guān)于python3.9安裝wordcloud出錯的問題及解決辦法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11