最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python多線程原理與用法詳解

 更新時間:2018年08月20日 14:42:33   作者:噴跑的豆子  
這篇文章主要介紹了Python多線程原理與用法,簡單描述了多線程的概念、原理并結(jié)合實例形式分析了Python多線程創(chuàng)建、啟動、各種鎖機制、隊列及相關(guān)函數(shù)使用技巧,需要的朋友可以參考下

本文實例講述了Python多線程原理與用法。分享給大家供大家參考,具體如下:

多線程(英語:multithreading),是指從軟件或者硬件上實現(xiàn)多個線程并發(fā)執(zhí)行的技術(shù)。具有多線程能力的計算機因有硬件支持而能夠在同一時間執(zhí)行多于一個線程,進而提升整體處理性能。具有這種能力的系統(tǒng)包括對稱多處理機、多核心處理器以及芯片級多處理(Chip-level multithreading)或同時多線程(Simultaneous multithreading)處理器。[1] 在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理(Multithreading)”。具有多線程能力的計算機因有硬件支持而能夠在同一時間執(zhí)行多于一個線程(臺灣譯作“執(zhí)行緒”),進而提升整體處理性能。

創(chuàng)建并啟動一個線程

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

join

等待當(dāng)前線程執(zhí)行完畢

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)

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

active_count

程序的線程數(shù)量,數(shù)量=主線程+子線程數(shù)量

Lock(互斥鎖)

Python編程中,引入了對象互斥鎖的概念,來保證共享數(shù)據(jù)操作的完整性。每個對象都對應(yīng)于一個可稱為” 互斥鎖” 的標(biāo)記,這個標(biāo)記用來保證在任一時刻,只能有一個線程訪問該對象。在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中執(zhí)行的結(jié)果將會是亂的。在Python3.x中執(zhí)行卻總是正確的,似乎是自動為其加了鎖

RLock(遞歸鎖,可重入鎖)

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

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()

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

lock = threading.Lock()

修改為:

lock = threading.RLock()

那么程序?qū)⒉粫l(fā)生死鎖情況。

最大可執(zhí)行線程

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

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()

執(zhí)行效果:

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

Event

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

  • - clear:清除標(biāo)記
  • - set:設(shè)置標(biāo)記
  • - is_set:是否被標(biāo)記
  • - wait:等待被標(biāo)記

代碼示例:

import threading,time
def lighter():
  num = 0
  event.set()   # 設(shè)置標(biāo)記
  while True:
    if num >= 5 and num < 10:
      event.clear()  # 清除標(biāo)記
      print("紅燈亮起,車輛禁止通行")
    if num >= 10:
      event.set()   # 設(shè)置標(biāo)記
      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()

這是一個簡單的紅燈停綠燈行案例。初始設(shè)置為綠燈并標(biāo)記,車輛看到標(biāo)記后通行,當(dāng)紅燈亮起的時候取消標(biāo)記,車輛看到?jīng)]有標(biāo)記時停下,等待標(biāo)記。

Queue隊列

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

  • - queue.Queue():先進先出
  • - queue.LifoQueue():先進后出
  • - queue.PriorityQueue:優(yōu)先級隊列,優(yōu)先級的值越小,越先執(zhí)行

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

  • - get():獲取item,如果隊列已經(jīng)取空將會卡住??稍O(shè)置timeout參數(shù),給定一個超時的值,或者設(shè)置參數(shù)block=False,隊列空直接拋異常
  • - get_nowait():b獲取item。如果隊列取空了,將會直接拋異常
  • - put():放入隊列
  • - empty():隊列是否為空
  • - qsize():獲取隊列的item數(shù)量

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python進程與線程操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設(shè)計入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對大家Python程序設(shè)計有所幫助。

相關(guān)文章

  • flask開啟多線程的具體方法

    flask開啟多線程的具體方法

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于flask開啟多線程的具體方法,對此有需求的可以學(xué)習(xí)參考下。
    2020-08-08
  • python-opencv中的cv2.inRange函數(shù)用法說明

    python-opencv中的cv2.inRange函數(shù)用法說明

    這篇文章主要介紹了python-opencv中的cv2.inRange函數(shù)用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Python 生成一個從0到n個數(shù)字的列表4種方法小結(jié)

    Python 生成一個從0到n個數(shù)字的列表4種方法小結(jié)

    今天小編就為大家分享一篇Python 生成一個從0到n個數(shù)字的列表4種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 使用Python實現(xiàn)炫酷的數(shù)據(jù)動態(tài)圖大全

    使用Python實現(xiàn)炫酷的數(shù)據(jù)動態(tài)圖大全

    數(shù)據(jù)可視化是通過圖形、圖表、地圖等可視元素將數(shù)據(jù)呈現(xiàn)出來,以便更容易理解、分析和解釋,它是將抽象的數(shù)據(jù)轉(zhuǎn)化為直觀形象的過程,本文給大家介紹了使用Python實現(xiàn)炫酷的數(shù)據(jù)動態(tài)圖大全,需要的朋友可以參考下
    2024-06-06
  • Python使用bcrypt?或?Passlib?對系統(tǒng)用戶密碼進行哈希和驗證處理操作

    Python使用bcrypt?或?Passlib?對系統(tǒng)用戶密碼進行哈希和驗證處理操作

    在Python?開發(fā)中,我們可以引入bcrypt?或?Passlib?對系統(tǒng)用戶密碼進行哈希和驗證處理,以及介紹使用其他類庫實現(xiàn)常規(guī)加解密處理操作,需要的朋友可以參考下
    2024-08-08
  • 如何獲取Python簡單for循環(huán)索引

    如何獲取Python簡單for循環(huán)索引

    這篇文章主要介紹了如何獲取Python簡單for循環(huán)索引,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Python測試線程應(yīng)用程序過程解析

    Python測試線程應(yīng)用程序過程解析

    這篇文章主要介紹了Python測試線程應(yīng)用程序過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Python 標(biāo)準(zhǔn)庫time時間的訪問和轉(zhuǎn)換問題小結(jié)

    Python 標(biāo)準(zhǔn)庫time時間的訪問和轉(zhuǎn)換問題小結(jié)

    time 模塊為 Python 提供了處理時間和日期的多種功能,適用于多種與時間相關(guān)的場景,包括獲取當(dāng)前時間、格式化時間、暫停程序執(zhí)行、計算程序運行時長等,這篇文章主要介紹了Python 標(biāo)準(zhǔn)庫time時間的訪問和轉(zhuǎn)換,需要的朋友可以參考下
    2025-01-01
  • Python網(wǎng)絡(luò)編程實戰(zhàn)之爬蟲技術(shù)入門與實踐

    Python網(wǎng)絡(luò)編程實戰(zhàn)之爬蟲技術(shù)入門與實踐

    這篇文章主要介紹了Python網(wǎng)絡(luò)編程實戰(zhàn)之爬蟲技術(shù)入門與實踐,了解這些基礎(chǔ)概念和原理將幫助您更好地理解網(wǎng)絡(luò)爬蟲的實現(xiàn)過程和技巧,需要的朋友可以參考下
    2023-04-04
  • PyTorch中的方法torch.randperm()示例介紹

    PyTorch中的方法torch.randperm()示例介紹

    在 PyTorch 中,torch.randperm(n) 函數(shù)用于生成一個從 0 到 n-1 的隨機排列的整數(shù)序列,這篇文章主要介紹了PyTorch中的方法torch.randperm()介紹,需要的朋友可以參考下
    2024-05-05

最新評論

霍州市| 行唐县| 昌邑市| 平南县| 芒康县| 滕州市| 闸北区| 苏尼特左旗| 新乡县| 长泰县| 中牟县| 汽车| 会理县| 襄城县| 申扎县| 沁水县| 文山县| 阿拉善盟| 巴塘县| 正宁县| 上犹县| 日土县| 南皮县| 昌都县| 道孚县| 噶尔县| 健康| 藁城市| 固原市| 安康市| 鄂托克前旗| 泾川县| 金平| 海伦市| 金昌市| 江安县| 隆昌县| 巫溪县| 乃东县| 广州市| 军事|