1. 程式人生 > 實用技巧 >Python基礎筆記:執行緒與程序

Python基礎筆記:執行緒與程序

守護程序

from threading import Thread
import time
import os
def task(name):
    print('%s is running ' % name)
    time.sleep(1)
    print('%s is over ' % name)

def test():
    time.sleep(3)
    print('over')

if __name__ == '__main__':
    t = Thread(target=task,args=('lichang',))
    test = Thread(target=test)

    t.daemon = True # 開啟守護執行緒
    t.start()
    test.start()
    print('主')

執行緒互斥鎖

from threading import Thread, Lock
import time
money = 100
mutex = Lock()
def task():
    global money
    mutex.acquire()
    tmp = money
    time.sleep(0.1)
    money = tmp - 1
    mutex.release()

if __name__ == '__main__':
    # mutex = Lock()

    t_list = []

    for i in range(100):
        t = Thread(target=task)
        t.start()
        t_list.append(t)

    for t in t_list:
        t.join()
    print(money)

'''資料錯亂,加鎖處理'''

GIL全域性解釋鎖

Python直譯器有多個版本
普遍使用的是Cpython

  1. GIL不是Python的特點而是Cpython的特點
  2. GIL是保證直譯器級別的資料安全
  3. GIL會導致同一個程序下的多個執行緒無法同時執行
  4. 針對不同的資料還是需要不同的鎖處理
  5. 解釋型語言的通病:同一個程序下多個執行緒無法利用多核優勢

在cpython直譯器中GIL是一把互斥鎖,用來阻止同一個程序下的多個執行緒的同時執行

同一個程序下的多個執行緒無法利用多核優勢

Python的多執行緒是不是沒有什麼用?

因為Cpython中的記憶體管理不是執行緒安全的
記憶體管理(垃圾回收機制)

  • 應用計數
  • 標記清除
  • 分代回收

同一程序下的多執行緒無法利用多核優勢,是不是就沒什麼用

多執行緒是否有用要看具體情況
多程序:相對浪費資源
多執行緒:更加節省資源
IO密集型\計算密集型
IO密集型條件下使用多執行緒效率更高
計算密集型條件下使用多程序效率更高

多程序和多執行緒都有各自的優勢
並且在實戰寫專案時通常可以:多執行緒下面再開設多執行緒

總結

  • 開啟程序的兩種方式
開程序和開執行緒的步驟基本是一樣的,只是匯入的模組不一樣而已
開程序程式碼必須寫在main下面,而開程序則無需這麼做

類的物件呼叫方法
類的繼承重寫Run方法
  • TCP服務端實現併發
將接客與服務的活分開
  • 執行緒物件的join方法
等待當前執行緒物件結束之後,再繼續往下執行
  • 同一個程序內的多個執行緒資料是共享的
同一個程序內可以開設多個執行緒
程序:資源單位
執行緒:執行單位
  • 執行緒物件屬性和方法
current_thread
active_count    當前活躍的執行緒
  • 守護執行緒
主執行緒必須等待所有非守護執行緒的結束才能結束
t.daemon = True
t.start()
  • 執行緒互斥鎖
當多個執行緒在操作同一份資料的時候可能會造成資料的錯亂
這時為了保證資料的安全,我們通常會加鎖處理
鎖:
    將併發變成序列,降低了程式的執行效率但是保證了資料的安全
一般不會遇到鎖的問題,底層封裝已處理
  • GIL全域性直譯器鎖
1. GIL不是Python的特點而是Cpython的特點
2. GIL本身也是一把互斥鎖,但是它是直譯器級別的
3. 它的存在是因為Cpython直譯器記憶體管理不是執行緒安全
    垃圾回收機制
        - 應用計數
        - 標記清除
        - 分代回收
4. 也就意味著GIL的存在導致了同一個程序下的多個執行緒無法利用多核優勢(不能同時執行)
5. 針對不同的資料應該加不同的鎖來保證安全
  • python多執行緒是否有用
結合任務的具體型別再做判斷
應該對任務分兩種情況討論
IO密集型
    多執行緒更加節省資源
計算密集型
    多程序更加合理
多程序和多執行緒均有用,且後面的操作都是多程序加多執行緒從而達到效率最大化