Python多线程和队列结合demo
一、使用場景
大家都知道python的多線程不是真正的多線程,但是對于io類型的任務,多線程還是能發(fā)揮作用的。那么多個線程之間是如何進行變量共享的呢,很多時候我們可以借助queue模塊,方便。今天就做一個學習。
二、threading模塊
Python的多線程還是主要使用標準庫threading,該庫提供了更高級別、功能更全面的線程管理。
該模塊提供的主要方法:
threading.currentThread(): 返回當前的線程變量。
threading.enumerate(): 返回一個包含正在運行的線程的list。正在運行指線程啟動后、結(jié)束前,不包括啟動前和終止后的線程。
threading.activeCount(): 返回正在運行的線程數(shù)量,與len(threading.enumerate())有相同的結(jié)果。
除了使用方法外,threading模塊同樣提供了Thread類來處理線程,Thread類提供了以下方法:
run(): 用以表示線程活動的方法。
start():啟動線程活動。
join([time]): 等待至線程中止。這阻塞調(diào)用線程直至線程的join() 方法被調(diào)用中止-正常退出或者拋出未處理的異常-或者是可選的超時發(fā)生。
isAlive(): 返回線程是否活動的。
getName(): 返回線程名。
setName(): 設(shè)置線程名。
Demo
# encoding: utf-8""" @python: v3.5.4 @author: hutong @file: countthread.py @time: 2019/07/06 下午11:18 """import threading import timedef run(n):print("task", n)time.sleep(5) #此時子線程停1sthreads_list = [] for i in range(3):t= threading.Thread(target=run, args=("t-%s" % i,))threads_list.append(t)t.start()print(t.getName(),threading.active_count()) # 輸出當前活躍的線程數(shù)for mythread in threads_list:mythread.join() #等待所有的子線程都跑完 print('all threads is done') #主線程三、queue模塊
Queue模塊可以用來實現(xiàn)多線程間通訊,讓各個線程共享數(shù)據(jù),生產(chǎn)者把任務放到Queue中,供消費者(線程)去使用。在python3中,Queue模塊被命名為queue。
Queue的對象有:
Queue.Queue(maxsize=0):創(chuàng)建大小為maxsize的FIFO(First In First Out)-Queue對象,如果maxsize不設(shè)置,這個隊列將是無限的。
Queue.LifoQueue(maxsize=0): 創(chuàng)建先入后出的對象,即棧。Queue.PriorityQueue(maxsize=0):有優(yōu)先級的隊列。
Queue對象的方法有:
queue對象實現(xiàn)一個fifo隊列(其他的還有l(wèi)ifo、priority隊列,這里不再介紹)。queue只有qsize一個構(gòu)造參數(shù),用來指定隊列容量,指定為0的時候代表容量無限。主要有以下成員函數(shù):
Queue.qsize():返回消息隊列的當前空間。返回的值不一定可靠。
Queue.empty():判斷消息隊列是否為空,返回True或False。同樣不可靠。
Queue.full():類似上邊,判斷消息隊列是否滿
Queue.put(item, block=True, timeout=None):往消息隊列中存放消息。block可以控制是否阻塞,timeout指定阻塞時候的等待時間。如果不阻塞或者超市,會引起一個full exception。
Queue.put_nowait(item):相當于put(item, False).
Queue.get(block=True, timeout=None):獲取一個消息,其他同put。
以下兩個函數(shù)用來判斷消息對應的任務是否完成。
Queue.task_done():接受消息的線程通過調(diào)用這個函數(shù)來說明消息對應的任務已完成。
Queue.join():調(diào)用線程阻塞直到所有消息對應的任務已經(jīng)完成。
消息隊列實例中維護的有待完成任務變量。每接收到一個消息該值自增一次。每調(diào)用一次.task_done()可以使該值減1,當待完成任務值為0的時候,join函數(shù)才會返回。
四、threading和queue結(jié)合
大家可以參考如下的一個例子嘗試完成任務。
demo
往隊列里產(chǎn)生5條任務,啟動5個線程去執(zhí)行,由于是并行,所以總共耗時4s。如果更改單線程執(zhí)行,那么就需要0+1+2+3+4=10s的時間。
小任務:大家可以嘗試利用threading和queue完成一個上傳文件到多臺服務器。
總結(jié)
以上是生活随笔為你收集整理的Python多线程和队列结合demo的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据分箱技术在Python中实现
- 下一篇: Python代码加密混淆