1. 程式人生 > >python 多執行緒+queue

python 多執行緒+queue

python的queue設計的是執行緒安全的,所以大傢伙放心用吧!
python多執行緒的一種簡單的實現如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
import time

def fun(argv):
    print 'in', argv
    time.sleep(2)

threads = []    #用於儲存執行緒
for i in range(5):  #開5個執行緒
    t = threading.Thread(target = fun, args = str(i))
    threads.append(t)

if
__name__ == '__main__': #開始所有的執行緒 for i in threads: i.start() #保證執行緒執行完 for i in threads: i.join() print 'all over'

程式執行結果如下
這裡寫圖片描述
使用threading可以很容易的開啟多執行緒,join的作用是用於執行緒同步,看自己的需求而定。
好了,現在進入正題,多執行緒+queue怎麼弄,先給出程式碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import
Queue import threading import time Thread_id = 1 Thread_num = 3 class myThread(threading.Thread): def __init__(self, q): global Thread_id threading.Thread.__init__(self) self.q = q self.Thread_id = Thread_id Thread_id = Thread_id + 1 def run(self): while
True: try: task = self.q.get(block = True, timeout = 1) #不設定阻塞的話會一直去嘗試獲取資源 except Queue.Empty: print 'Thread' , self.Thread_id , 'end' break #取到資料,開始處理(依據需求加處理程式碼) print "Starting " , self.Thread_id print task self.q.task_done() print "Ending " , self.Thread_id q = Queue.Queue(10) #向資源池裡面放10個數用作測試 for i in range(10): q.put(i) #開Thread_num個執行緒 for i in range(0, Thread_num): worker = myThread(q) worker.start() q.join() #等待所有的佇列資源都用完 print "Exiting Main Thread"

結果如下
這裡寫圖片描述
是不是感覺很亂,哈哈沒關係,這才是多執行緒的魅力所在!你永遠不知道是從哪個執行緒開始。
在這裡Queue作為資源池,執行緒去從資源池中取資料進行處理,可是為什麼需要用到Queue呢, 因為可能資源池很大,而開的執行緒數有限,所以等一個執行緒處理完它的任務之後,它可以繼續去取資源處理!這就可以讓先執行完一個任務的執行緒不立即停下來,而是去取另一個資源處理,直到沒有資料的時候它才會停下來。簡單理解:q.task_done是表明當前的資源處理完了,q.join()會等到所有的資源都被處理了才會向下繼續執行,這就是一種同步。