1. 程式人生 > 實用技巧 >關於Python | 程序 & 執行緒的理解拾遺,全部乾貨不看可就沒了

關於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)