1. 程式人生 > >Python 多執行緒-threading

Python 多執行緒-threading

多執行緒-threading

1、python的threading模組是對thread做了一些包裝的,可以更加方便的被使用

  1. 主執行緒會等待所有的子執行緒結束後才結束

  2. 檢視執行緒數量

    length = len(threading.enumerate())

4、多執行緒程式的執行順序是不確定的

  1. 總結

    1. 每個執行緒一定會有一個名字,儘管上面的例子中沒有指定執行緒物件的name,但是python會自動為執行緒指定一個名字。
    2. 當執行緒的run()方法結束時該執行緒完成。
    3. 無法控制執行緒排程程式,但可以通過別的方式來影響執行緒排程的方式。
    4. 執行緒的5種狀態 在這裡插入圖片描述

6、多執行緒-共享全域性變數

總結:

  • 在一個程序內的所有執行緒共享全域性變數,能夠在不適用其他方式的前提下完成多執行緒之間的資料共享(這點要比多程序要好)
  • 缺點就是,執行緒是對全域性變數隨意修改可能造成多執行緒之間對全域性變數的混亂(即執行緒非安全)

程序VS執行緒

1、都能夠完成多工

2、排程方式不一樣

  • 程序是系統進行資源分配和排程的一個獨立單位.
  • 執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.

3、區別

  • 一個程式至少有一個程序,一個程序至少有一個執行緒.
  • 執行緒的劃分尺度小於程序(資源比程序少),使得多執行緒程式的併發性高。
  • 程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率
  • 線執行緒不能夠獨立執行,必須依存在程序中

4、優缺點

執行緒和程序在使用上各有優缺點:執行緒執行開銷小,但不利於資源的管理和保護;而程序正相反。

同步的概念

同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。

互斥鎖

總結

鎖的好處:

  • 確保了某段關鍵程式碼只能由一個執行緒從頭到尾完整地執行

鎖的壞處:

  • 阻止了多執行緒併發執行,包含鎖的某段程式碼實際上只能以單執行緒模式執行,效率就大大地下降了
  • 由於可以存在多個鎖,不同的執行緒持有不同的鎖,並試圖獲取對方持有的鎖時,可能會造成死鎖

多執行緒-非共享資料

小總結

  • 在多執行緒開發中,全域性變數是多個執行緒都共享的資料,而區域性變數等是各自執行緒的,是非共享的

死鎖

避免死鎖

  • 新增超時時間等

總結

  • 可以使用互斥鎖完成多個任務,有序的程序工作,這就是執行緒的同步

Queue的說明

  1. 對於Queue,在多執行緒通訊之間扮演重要的角色
  2. 新增資料到佇列中,使用put()方法
  3. 從佇列中取資料,使用get()方法
  4. 判斷佇列中是否還有資料,使用qsize()方法

ThreadLocal

import threading

# 建立全域性ThreadLocal物件:
local_school = threading.local()

def process_student():
    # 獲取當前執行緒關聯的student:
    std = local_school.student
    print('Hello, %s (in %s)' % (std, threading.current_thread().name))

def process_thread(name):
    # 繫結ThreadLocal的student:
    local_school.student = name
    process_student()

t1 = threading.Thread(target= process_thread, args=('dongGe',), name='Thread-A')
t2 = threading.Thread(target= process_thread, args=('老王',), name='Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()

執行結果:

Hello, dongGe (in Thread-A)
Hello, 老王 (in Thread-B)

小結

一個ThreadLocal變數雖然是全域性變數,但每個執行緒都只能讀寫自己執行緒的獨立副本,互不干擾。ThreadLocal解決了引數在一個執行緒中各個函式之間互相傳遞的問題