python 多執行緒 queue

2021-08-03 13:16:20 字數 2262 閱讀 5094

python的queue設計的是執行緒安全的,所以大傢伙放心用吧!

python多執行緒的一種簡單的實現如下:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import threading

import time

deffun

(argv):

print

'in', argv

time.sleep(2)

threads = #用於儲存執行緒

for i in range(5): #開5個執行緒

t = threading.thread(target = fun, args = str(i))

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

defrun

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

多執行緒queue

一 class queue.queue maxsize 0 佇列 先進先出 import queue q queue.queue q.put first q.put second q.put third print q.get print q.get print q.get 結果 先進先出 firs...

python多執行緒爬蟲學習 Queue

queue是python多執行緒安全的佇列實現,封裝了資料結構中的佇列,保證了執行緒之間使用佇列同步資料不會出錯。也就是說使用queue就不用使用鎖去同步資料。queue預設構造的大小是無限的,也可以在初始化時指定佇列大小 queue q 10 queue的使用函式 get 獲取佇列頭部元素,並且把...

python爬蟲多執行緒之queue

首先先來介紹下queue這個包吧,這個包叫佇列,沒錯,就是那個和棧反過來的那個佇列,大家一聽佇列就隨口說出先進先出,而棧則是後進先出,為什麼要用用佇列來實現,其實我也不知道,反正用過之後很順手,具體 也說不上來 先來看下佇列的內建方法的,我們只需要記住兩個,乙個是put 放 另乙個是get 獲得,因...