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()會等到所有的資源都被處理了纔會向下繼續執行,這就是一種同步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章