91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python多線程的原理是什么

發布時間:2021-05-10 17:37:56 來源:億速云 閱讀:192 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關Python多線程的原理是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Python主要用來做什么

Python主要應用于:1、Web開發;2、數據科學研究;3、網絡爬蟲;4、嵌入式應用開發;5、游戲開發;6、桌面應用開發。

創建并啟動一個線程

import threading
def runtask(name):
  print("%s線程已啟動"%name)
t = threading.Thread(target=runtask,args=("task1",))  # args因為是一個元組,所以必須這樣寫,否則運行將報錯
t.start()

join

等待當前線程執行完畢

import threading
import time
def runtask(name):
  print("%s線程已啟動"%name)
  time.sleep(2)
t = threading.Thread(target=runtask,args=("task1",))
t.start()
t.join()
print("abc")  # 過了2s才會打印,若無等待將看不到等待2s的效果

setDaemon(True)

將線程設置為守護線程。若設置為守護線程,主線程結束后,子線程也將結束,并且主線程不會理會子線程是否結束,主線程不會等待子線程結束完后才結束。若沒有設置為守護線程,主線程會等待子線程結束后才會結束。

active_count

程序的線程數量,數量=主線程+子線程數量

Lock(互斥鎖)

Python編程中,引入了對象互斥鎖的概念,來保證共享數據操作的完整性。每個對象都對應于一個可稱為” 互斥鎖” 的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。在Python中我們使用threading模塊提供的Lock類。

import threading,time
def runtask(name):
  global count
  time.sleep(1)
  lock.acquire()   # 獲取鎖資源,并返回是否獲取成功
  count+=1
  print(name,count)
  lock.release()   # 釋放資源
count = 0
lock = threading.Lock()   # 互斥鎖
for index in range(50):
  t = threading.Thread(target=runtask,args=("thread%d"%index,))
  t.start()

上面這段代碼如果沒有加上互斥鎖,在Python2.x中執行的結果將會是亂的。在Python3.x中執行卻總是正確的,似乎是自動為其加了鎖

RLock(遞歸鎖,可重入鎖)

當一個線程中遇到鎖嵌套情況該怎么辦,又會遇到什么情況?

def run1():
  global count1
  lock.acquire()
  count1 += 1
  lock.release()
  return count1
def run2():
  global count2
  lock.acquire()
  count2 += 1
  lock.release()
  return count2
def runtask():
  lock.acquire()
  r1 = run1()
  print("="*30)
  r2 = run2()
  lock.release()
  print(r1,r2)
count1,count2 = 0,0
lock = threading.Lock()
for index in range(50):
  t = threading.Thread(target=runtask,)
  t.start()

這是一個很簡單的線程鎖死案例,程序將被卡死,停止不動。為了解決這一情況,Python提供了遞歸鎖RLock(可重入鎖)。這個RLock內部維護著一個Lock和一個counter變量,counter記錄了acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源。上面的代碼只需做一些小小的改動

lock = threading.Lock()

修改為:

lock = threading.RLock()

那么程序將不會發生死鎖情況。

最大可執行線程

threading.BoundedSemaphore(5)設置可同時執行的最大線程數為5個,后面的線程需排隊等待前面的線程執行完畢

import time,threading
def runtask(name):
  global num
  semaphore.acquire()
  time.sleep(1)
  num += 1
  semaphore.release()
  print(name,num)
num = 0
semaphore = threading.BoundedSemaphore(5)
for index in range(50):
  t = threading.Thread(target=runtask,args=("線程%s"%index,))
  t.start()

執行效果:

Python多線程的原理是什么

可以看出上面的程序是每次只有5個線程在同時運行,其他線程需等待前面的線程執行完畢,這就是最大可執行線程。

Event

Python提供了Event對象用于線程間通信,它是由線程設置的信號標志,如果信號標志位為假,則線程等待直到信號被其他線程設置成真。Event中提供了四個重要的方法來滿足基本的需求。

  • - clear:清除標記

  • - set:設置標記

  • - is_set:是否被標記

  • - wait:等待被標記

代碼示例:

import threading,time
def lighter():
  num = 0
  event.set()   # 設置標記
  while True:
    if num >= 5 and num < 10:
      event.clear()  # 清除標記
      print("紅燈亮起,車輛禁止通行")
    if num >= 10:
      event.set()   # 設置標記
      print("綠燈亮起,車輛可以通行")
      num = 0
    num += 1
    time.sleep(1)
def car():
  while True:
    if event.is_set():
      print("車輛正在跑...")
    else:
      print("車輛停下了")
      event.wait()
    time.sleep(1)
event = threading.Event()
t1 = threading.Thread(target=lighter,)
t2 = threading.Thread(target=car,)
t1.start()
t2.start()

這是一個簡單的紅燈停綠燈行案例。初始設置為綠燈并標記,車輛看到標記后通行,當紅燈亮起的時候取消標記,車輛看到沒有標記時停下,等待標記。

Queue隊列

使任務按照某一種特定順序有條不紊的進行。下面介紹幾種常用的隊列:

  • - queue.Queue():先進先出

  • - queue.LifoQueue():先進后出

  • - queue.PriorityQueue:優先級隊列,優先級的值越小,越先執行

下面介紹幾種常用的方法:

  • - get():獲取item,如果隊列已經取空將會卡住。可設置timeout參數,給定一個超時的值,或者設置參數block=False,隊列空直接拋異常

  • - get_nowait():b獲取item。如果隊列取空了,將會直接拋異常

  • - put():放入隊列

  • - empty():隊列是否為空

  • - qsize():獲取隊列的item數量

上述就是小編為大家分享的Python多線程的原理是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲阜市| 周宁县| 武穴市| 天津市| 额济纳旗| 额尔古纳市| 古丈县| 长乐市| 金山区| 陕西省| 忻城县| 榆树市| 四会市| 浑源县| 韶关市| 墨玉县| 岳西县| 濮阳市| 清涧县| 万州区| 英山县| 清新县| 增城市| 湖北省| 三门峡市| 石门县| 缙云县| 太仓市| 锡林浩特市| 长兴县| 南投县| 威远县| 长春市| SHOW| 沙田区| 白银市| 鹤壁市| 额济纳旗| 商南县| 赤城县| 华容县|