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

Python多線程模塊Threading用法示例小結

 更新時間:2019年11月09日 07:56:05   作者:Secret608  
這篇文章主要介紹了Python多線程模塊Threading用法,結合實例形式分析了Python多線程模塊Threading相關概念、原理、進程與線程的區(qū)別及使用技巧,需要的朋友可以參考下

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

步入正題前,先準備下基本知識,線程與進程的概念。

   相信作為一個測試人員,如果從理論概念上來說其兩者的概念或者區(qū)別,估計只會一臉蒙蔽,這里就舉個例子來說明下其中的相關概念。

  平安夜剛過,你是吃到了蘋果還是香蕉呢。。。其實當你用手去接下對方蘋果的時候,你的手臂就可以比喻成進程,你的五個手指就可以比喻成線程,所以很明顯,線程可以說是進程的細化,沒有進程就不會有線程。

   這里還是說下必要的概念:

    進程

   是操作系統(tǒng)中當前程序的一次執(zhí)行。要知道擁有單個CPU的電腦,在嚴格意義上,一個時間點上操作系統(tǒng)只能進行同一個工作命令。由于計算機的運行速度快,在工作時可以運行一會A代碼,運行一會B代碼,交錯運行,由于運算速度快,所以一般看來它好像可以同時進行多個程序--這就是多進程。

    線程

   線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執(zhí)行單元,是系統(tǒng)獨立調度和分派CPU的基本單位,這里的單位指運行中的程序的調度單位。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。線程還可以自己創(chuàng)建、撤銷和切換。就像拿蘋果,如果一根手指可以辦到,那它就是單線程,如果需要多根手指,那就是多線程。

  進程和線程的區(qū)別

     (1)進程是資源的分配和調度的一個獨立單元,而線程是CPU調度的基本單元
          (2)同一個進程中可以包括多個線程,并且線程共享整個進程的資源(寄存器、堆棧、上下文),一個進程至少包括一個線程。
          (3)進程結束后它擁有的所有線程都將銷毀,而線程的結束不會影響同個進程中的其他線程的結束
          (4)線程是輕量級的進程,它的創(chuàng)建和銷毀所需要的時間比進程小很多,所有操作系統(tǒng)中的執(zhí)行功能都是創(chuàng)建線程去完成的
          (5)線程中執(zhí)行時一般都要進行同步和互斥,因為他們共享同一進程的所有資源(資源競爭)
          (6)線程有自己的私有屬性TCB,線程id,寄存器、硬件上下文,而進程也有自己的私有屬性進程控制塊PCB,這些私有屬性是不被共享的,用來標示一個進程或一個線程的標志

  子進程與子線程的區(qū)別

   進程和線程的區(qū)別在于粒度不同, 進程之間的變量(或者說是內存)是不能直接互相訪問的, 而線程可以, 線程一定會依附在某一個進程上執(zhí)行.我舉個例子, 你在Windows下開一個IE瀏覽器, 這個IE瀏覽器是一個進程. 你用瀏覽器去打開一個pdf, IE就去調用Acrobat去打開, 這時Acrobat是一個獨立的進程, 就是IE的子進程.而IE自己本身同時用同一個進程開了2個網頁, 并且同時在跑兩個網頁上的腳本, 這兩個網頁的執(zhí)行就是IE自己通過兩個線程實現(xiàn)的.值得注意的是, 線程仍然是IE的內容, 而子進程Acrobat嚴格來說就不屬于IE了, 是另外一個程序,之所以是IE的子進程, 只是受IE調用而啟動的而已。

   這里大家可能會疑惑,進程分配內存空間的依據是啥?其實進程建立,系統(tǒng)會為其分配虛擬地址空間4GB(在32位系統(tǒng)中),具體分配情況要取決于該包含的所有可執(zhí)行模塊或dll模塊的代碼和數據,還包含動態(tài)內存分配的空間(如線程中堆棧的分配)

  好了,上面介紹了基本的線程及進程的概念,接下來可以開始正題了,這里主要總結下python內的Threading模塊

  python多線程之Threading

  單線程

  額,這個忽略吧。。。操作系統(tǒng)單任務的處理,排好隊,一個一個來就是單線程。

  多線程

  多線程Threading一般可以通過兩種渠道來實現(xiàn):一種是通過繼承Thread類,重寫它的run方法;另一種是創(chuàng)建一個threading.Thread對象,在它的初始化函數(__init__)中將可調用對象作為參數傳入,本質上來講,兩種方式一樣。

  來一發(fā)實例:

# -*- coding: utf-8 -*-
import threading
import time
#方式二是方式一的具體,方式一為類構造,方式二為方法實例構造,其實本質都是一樣,都是調用threading.Thread模塊
#方式一
count = 0
class Counter(threading.Thread):
  def __init__(self, lock, threadName):
    #注意:一定要顯式的調用父類的初始化函數,這里可以指定生成的線程名,可以是*args、**kwargs
    #def __init__(self, group=None, target=None, name=None, args=(), kwargs={}),其中group是預留的,將來用于擴展
    super(Counter, self).__init__(name=threadName)
    self.lock = lock
  def run(self):
    global count
    self.lock.acquire()
    for i in range(100):
      count = count + 1
    self.lock.release()
#方式二
lockA = threading.Lock()
lockB = threading.Lock()
rLock = threading.RLock()
condt = threading.Condition()
event = threading.Event()
def add(lockA):
  global count
  #定義當前資源只能單線程訪問,鎖住后完成資源調用一定要釋放鎖,不然會造成死鎖狀態(tài),甚至程序崩潰
  lockA.acquire()
  for i in range(1000):
    count = count + 1
  #資源調用完畢,釋放鎖
  lockA.release()
def addRunner():
  for i in range(2):
    th = threading.Thread(target=rloc, args=(rLock,))
    #開啟線程,從此刻起,多線程開始,主線程繼續(xù)前行
    th.start()
    #調用Thread.join[timeout]將會使主調線程堵塞,直到被調用線程運行結束或超時。參數timeout是一個數值類型,表示超時時間
    th.join()
    print '----- %s is start -----' % th.getName()
    print "over"
#RLock允許在同一線程中被多次acquire,避免單線程出現(xiàn)思索情況
def rloc(rLock):
  rLock.acquire()
  for i in range(2):
    rLock.acquire()
    print i,
    rLock.release()
  rLock.release()
  print "over!"
def rlocRun():
  for i in range(2):
    th = threading.Thread(target=rloc, args=(rLock,))
    th.start()
    print '----- %s is start -----' % th.getName()
    print "over"
#現(xiàn)在出現(xiàn)復雜的場景,多個線程需要調用多個共同的資源,此時就需要threading.Condition出馬,加入簡單的說就是A搞完了A的事
# ,就發(fā)廣播說明自己搞定了,其它人可以進來了,B同理。
def cond(cond):
  #適合那種主動休眠,被動喚醒的場景
  cond.acquire()
  global count
  for i in range(1000):
    count = count + 1
  #喚醒一個掛起的線程(如果存在掛起的線程),提醒當前的掛起的線程看看其它的鎖開了沒有,如果開了就搞其他的事。
  #注意:notify()方法不會釋放所占用的瑣。
  cond.notify()
  #wait方法釋放內部所占用的瑣,同時線程被掛起,直至接收到通知被喚醒或超時
  cond.wait(5)
  #相信大家應該看出問題來了,最后一個線程咋辦列,沒人喚醒啊,這個時候應該做過一個判斷
  cond.release()
  print "over!"
def condRun():
  global condt
  for i in range(0, 3):
    th = threading.Thread(target=cond, args=(condt, ))
    th.start()
    print '----- %s is start -----' % th.getName()
  print "over"
#此時可能會有一點問題,就是線程的同步(并發(fā))問題怎么解決呢?此時threading.Event出馬
def even(n, event):
  while not event.isSet():
    print 'Thread %s is ready' % n
  time.sleep(1)
  #同condition一樣,掛起該線程,等待set開關
  event.wait()
  while event.isSet():
    print 'Thread %s is running' % n
    time.sleep(1)
def evenRun():
  for i in range(0, 2):
    th = threading.Thread(target=even, args=(i, event))
    th.start()
  time.sleep(3)
  print '----- event is set -----'
  event.set()
  time.sleep(3)
  print '----- event is clear -----'
  event.clear()
if __name__ == "__main__":
  Counter(lockA, "thread1").start()
  addRunner()
  rlocRun()
  condRun()
  evenRun()

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python進程與線程操作技巧總結》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》、《Python+MySQL數據庫程序設計入門教程》及《Python常見數據庫操作技巧匯總

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

相關文章

最新評論

岳普湖县| 苍梧县| 水城县| 平利县| 阿克| 南充市| 鹤山市| 新昌县| 阜康市| 永吉县| 古交市| 乐亭县| 天镇县| 洪泽县| 大冶市| 尼勒克县| 沛县| 中牟县| 抚顺县| 阿克苏市| 繁峙县| 罗定市| 若羌县| 津南区| 南丰县| 元氏县| 全南县| 镇坪县| 乐清市| 天水市| 时尚| 山阳县| 连山| 苗栗县| 上饶市| 开鲁县| 都江堰市| 来宾市| 泽州县| 布拖县| 布拖县|