關於Python | 程序 & 執行緒的理解拾遺,全部乾貨不看可就沒了
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理
以下文章來源於騰訊雲 作者:鹹魚學Python
( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )
程序和執行緒的理解
執行緒是作業系統能夠進行預算排程的最小單位,它包含在程序中是程序中的實際運作單位。
Linux 程序有父程序和子程序,window 系統的程序是平等關係
一個標準的執行緒有執行緒 ID ,當前指令指標,暫存器集合和堆疊組成,在許多系統中,建立一個執行緒比建立一個程序要快 1- 100 倍。
每一個程序都認為自己獨佔所有的計算器硬體資源
程序就是獨立的王國,程序間不可以隨便共享資料
執行緒就是省份,同一個程序內的執行緒可以共享程序的資源,每一個程序擁有自己獨立的堆疊。
Python 中的程序和執行緒
程序會啟動一個直譯器程序,執行緒共享一個直譯器程序。
執行緒
建立一個最簡單的執行緒程式
import threading def worker(): print("hello world") t = threading.Thread(target=worker) # 建立執行緒物件 t.start() #啟動
使用 print 函式列印(因為執行緒切換回打斷 print 函式的執行 )會導致執行緒不安全,推薦使用 logging
import logging import threading FORMAT = '%(asctime-15s\t [%(threadName)s, %(thread)8d] %(message)s)' logging.basicConfig(level=logging.INFO, format=FORMAT) def worker(): for i in range(100): logging.info("{} is running".format(threading.current_thread().name)) for i in range(5): name = "workr-{}".format(i) threading.Thread(target=worker).start()
執行緒安全:執行緒執行一段程式碼,不會產生不確定的結果,那這段程式碼就是執行緒安全的
daemon 執行緒和 no-daemon 執行緒
這裡的 daemon 不是 linux 中的守護程序
如果有 non-daemon 執行緒的時候,主執行緒退出時也不會殺掉所有daemon執行緒,直到所有 non-daemon 執行緒全部結束,如果還有 daemon 執行緒,主執行緒需要退出,會結束所有的 daemon 執行緒退出
threading.local
Python 提供 threading.local 類,將這個類例項化得到一個全域性物件,但是不同執行緒使用這個物件儲存的資料其他執行緒看不見。
ctx = threading.local()
ctx.x = 123
Threading.local 類構建了一個大字典,其元素是每一執行緒例項的地址為 key 和執行緒物件引用執行緒單獨的字典的對映
{id(Thread)->(ref(Thread),thread-local dict)}
通過 threading.local 例項就可以在不同的執行緒中,安全的使用執行緒獨有的資料,做到執行緒間資料隔離,如同本地變數一樣安全。
threading.Timer
Threading.Timer 繼承自 Thread,這個類用來定義多久執行一個函式
class threading.Timer(interval, function, args=None, kwargs=None)
Start 方法執行之後,Timer 物件會處於等待狀態,等待了 interval 之後,開始執行 function 函式的
如果在執行函式之前的等待期間使用了 cancle 方法就會跳過執行函式結束。
def worker(): print("hello world") t = threading.Timer(5,worker)