亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python 使用threading+Queue實(shí)現(xiàn)線程池示例

 更新時(shí)間:2019年12月21日 13:44:18   作者:lx59  
今天小編就為大家分享一篇Python 使用threading+Queue實(shí)現(xiàn)線程池示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

一、線程池

1、為什么需要使用線程池

1.1 創(chuàng)建/銷毀線程伴隨著系統(tǒng)開銷,過于頻繁的創(chuàng)建/銷毀線程,會(huì)很大程度上影響處理效率。

記創(chuàng)建線程消耗時(shí)間T1,執(zhí)行任務(wù)消耗時(shí)間T2,銷毀線程消耗時(shí)間T3,如果T1+T3>T2,那說明開啟一個(gè)線程來執(zhí)行這個(gè)任務(wù)太不劃算了!在線程池緩存線程可用已有的閑置線程來執(zhí)行新任務(wù),避免了創(chuàng)建/銷毀帶來的系統(tǒng)開銷。

1.2 線程并發(fā)數(shù)量過多,搶占系統(tǒng)資源從而導(dǎo)致阻塞。

線程能共享系統(tǒng)資源,如果同時(shí)執(zhí)行的線程過多,就有可能導(dǎo)致系統(tǒng)資源不足而產(chǎn)生阻塞的情況。

1.3 對(duì)線程進(jìn)行一些簡單的管理。

比如:延時(shí)執(zhí)行、定時(shí)循環(huán)執(zhí)行的策略等,運(yùn)用線程池都能進(jìn)行很好的實(shí)現(xiàn)。

2、Python中建立線程池的方法

2.1 使用threadpool模塊,這是個(gè)python的第三方模塊,支持python2和python3

2.2 使用concurrent.futures模塊,這個(gè)模塊是python3中自帶的模塊,python2.7以上版本也可以安裝使用

2.3 自己構(gòu)建一個(gè)線程池

二、隊(duì)列(queue)

Queue模塊提供的隊(duì)列(FIFO)適用于多線程編程,在生產(chǎn)者(producer)和消費(fèi)者(consumer)之間線程安全(thread-safe)地傳遞消息或其它數(shù)據(jù),因此多個(gè)線程可以共用同一個(gè)Queue實(shí)例。常用方法:

Queue.qsize():返回queue的大小。

Queue.empty():判斷隊(duì)列是否為空,通常不太靠譜。

Queue.full():判斷是否滿了。

Queue.put(item, block=True, timeout=None): 往隊(duì)列里放數(shù)據(jù)。

Queue.put_nowait(item):往隊(duì)列里存放元素,不等待

Queue.get(item, block=True, timeout=None): 從隊(duì)列里取數(shù)據(jù)。

Queue.get_nowait(item):從隊(duì)列里取元素,不等待

Queue.task_done():表示隊(duì)列中某個(gè)元素是否的使用情況,使用結(jié)束會(huì)發(fā)送信息。

Queue.join():一直阻塞直到隊(duì)列中的所有元素都執(zhí)行完畢。

三、使用threading+Queue處理多任務(wù)

假設(shè)有十個(gè)任務(wù)需要處理,打算在后臺(tái)開啟五個(gè)線程,簡化后的模型

import Queue
import threading
import time
 
queue = Queue.Queue()
 
class ThreadNum(threading.Thread):
  def __init__(self, queue):
    threading.Thread.__init__(self)
    self.queue = queue
 
  def run(self):
    while True:
      #消費(fèi)者端,從隊(duì)列中獲取num
      num = self.queue.get()
      print("Retrieved", num)
      time.sleep(1) 
      #在完成這項(xiàng)工作之后,使用 queue.task_done() 函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個(gè)信號(hào)
      self.queue.task_done()
    
    print("Consumer Finished")
 
def main():
  #產(chǎn)生一個(gè) threads pool, 并把消息傳遞給thread函數(shù)進(jìn)行處理,這里開啟10個(gè)并發(fā)
  for i in range(5):
    t = ThreadNum(queue)
    t.setDaemon(True)
    t.start()
  
  #往隊(duì)列中填數(shù)據(jù) 
  for num in range(10):
    queue.put(num)
    #wait on the queue until everything has been processed
  
  queue.join()
   
if __name__ == '__main__':
  main()
  time.sleep(500)

輸出為:

('Retrieved', 0)
 ('Retrieved', 1)('Retrieved', 2)
('Retrieved', 3)
('Retrieved', 4)
('Retrieved', 5)('Retrieved', 6)
('Retrieved', 7)
('Retrieved', 8)
 ('Retrieved', 9)

具體工作步驟描述如下:

1、創(chuàng)建一個(gè) Queue.Queue() 的實(shí)例,然后使用數(shù)據(jù)對(duì)它進(jìn)行填充。

2、將經(jīng)過填充數(shù)據(jù)的實(shí)例傳遞給線程類,后者是通過繼承 threading.Thread 的方式創(chuàng)建的。

3、生成守護(hù)線程池。

4、每次從隊(duì)列中取出一個(gè)項(xiàng)目,并使用該線程中的數(shù)據(jù)和 run 方法以執(zhí)行相應(yīng)的工作。

5、在完成這項(xiàng)工作之后,使用 queue.task_done() 函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個(gè)信號(hào)。

6、對(duì)隊(duì)列執(zhí)行 join 操作,實(shí)際上意味著等到隊(duì)列為空,再退出主程序。

在使用這個(gè)模式時(shí)需要注意一點(diǎn):通過將守護(hù)線程設(shè)置為 true,程序運(yùn)行完自動(dòng)退出。好處是在退出之前,可以對(duì)隊(duì)列執(zhí)行 join 操作、或者等到隊(duì)列為空。

注意運(yùn)行main函數(shù)后繼續(xù)執(zhí)行time.sleep(500),可以觀察到主線程未結(jié)束的情況下ThreadNum(queue)生成的線程還在運(yùn)行。如果需要停止線程的話可以對(duì)以上代碼加以修改。

import Queue
import threading
import time
 
queue = Queue.Queue()
 
class ThreadNum(threading.Thread):
  """沒打印一個(gè)數(shù)字等待1秒,并發(fā)打印10個(gè)數(shù)字需要多少秒?"""
  def __init__(self, queue):
    threading.Thread.__init__(self)
    self.queue = queue
 
  def run(self):
    done = False
    while not done:
      #消費(fèi)者端,從隊(duì)列中獲取num
      num = self.queue.get()
      if num is None:
        done = True
      else:
        print("Retrieved", num)
      time.sleep(1) 
      #在完成這項(xiàng)工作之后,使用 queue.task_done() 函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個(gè)信號(hào)
      self.queue.task_done()
    
    print("Consumer Finished")
def main():
  #產(chǎn)生一個(gè) threads pool, 并把消息傳遞給thread函數(shù)進(jìn)行處理,這里開啟10個(gè)并發(fā)
  for i in range(5):
    t = ThreadNum(queue)
    t.setDaemon(True)
    t.start()
  
  #往隊(duì)列中填錯(cuò)數(shù)據(jù) 
  for num in range(10):
    queue.put(num)
  
  queue.join()
  time.sleep(100)
  for i in range(10):
    queue.put(None)
    print('None')
  time.sleep(200)
   
if __name__ == '__main__':
  start = time.time()
  main()
  print"Elapsed Time: %s" % (time.time() - start)

main函數(shù)執(zhí)行完后隊(duì)列向線程發(fā)送None消息,觸發(fā)線程的停止標(biāo)識(shí),這樣就可以動(dòng)態(tài)管理線程池了。

以上這篇Python 使用threading+Queue實(shí)現(xiàn)線程池示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中命名元組Namedtuple的使用詳解

    Python中命名元組Namedtuple的使用詳解

    Python支持一種名為“namedtuple()”的容器字典,它存在于模塊“collections”中,下面就跟隨小編一起學(xué)習(xí)一下Namedtuple的具體使用吧
    2023-09-09
  • Python實(shí)現(xiàn)各種排序算法的代碼示例總結(jié)

    Python實(shí)現(xiàn)各種排序算法的代碼示例總結(jié)

    這篇文章主要介紹了Python實(shí)現(xiàn)各種排序算法的代碼示例總結(jié),其實(shí)Python是非常好的算法入門學(xué)習(xí)時(shí)的配套高級(jí)語言,需要的朋友可以參考下
    2015-12-12
  • python處理cookie詳解

    python處理cookie詳解

    Cookie用于服務(wù)器實(shí)現(xiàn)會(huì)話,用戶登錄及相關(guān)功能時(shí)進(jìn)行狀態(tài)管理,本文介紹了使用python處理cookie的方法,需要的朋友可以參考下
    2014-02-02
  • 使用Python實(shí)現(xiàn) 學(xué)生學(xué)籍管理系統(tǒng)

    使用Python實(shí)現(xiàn) 學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要介紹了使用Python實(shí)現(xiàn) 學(xué)生學(xué)籍管理系統(tǒng),代碼大致分為五個(gè)函數(shù)組成,具體內(nèi)容詳情本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2019-11-11
  • python使用js2py庫運(yùn)行js代碼

    python使用js2py庫運(yùn)行js代碼

    本文主要介紹了thon使用js2py庫運(yùn)行js代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • python matplotlib imshow熱圖坐標(biāo)替換/映射實(shí)例

    python matplotlib imshow熱圖坐標(biāo)替換/映射實(shí)例

    這篇文章主要介紹了python matplotlib imshow熱圖坐標(biāo)替換/映射實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python導(dǎo)入txt數(shù)據(jù)到mysql的方法

    Python導(dǎo)入txt數(shù)據(jù)到mysql的方法

    這篇文章主要介紹了Python導(dǎo)入txt數(shù)據(jù)到mysql的方法,涉及Python操作txt文件及mysql數(shù)據(jù)庫的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • python實(shí)現(xiàn)套接字創(chuàng)建

    python實(shí)現(xiàn)套接字創(chuàng)建

    這篇文章主要為大家介紹了python套接字創(chuàng)建實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python生成詞云的實(shí)現(xiàn)代碼

    Python生成詞云的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python生成詞云,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 樹莓派使用USB攝像頭和motion實(shí)現(xiàn)監(jiān)控

    樹莓派使用USB攝像頭和motion實(shí)現(xiàn)監(jiān)控

    這篇文章主要為大家詳細(xì)介紹了樹莓派使用USB攝像頭和motion實(shí)現(xiàn)監(jiān)控,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評(píng)論