Python常用模組之二 Queue

2022-09-11 07:54:12 字數 3221 閱讀 1986

python中,佇列是執行緒間最常用的交換資料的形式。queue模組是提供佇列操作的模組,雖然簡單易用,但是不小心的話,還是會出現一些意外。

queue佇列的原則時:先進先出,後進後出

常用方法:

q.put()

q.get()

q.maxsize()

q.qsize() 返回佇列的大小

q.empty() 如果隊列為空,返回true,反之false

q.full() 如果佇列滿了,返回true,反之false

q.full 與 maxsize 大小對應

q.get([block[, timeout]]) 獲取佇列,timeout等待時間

q.get_nowait() 相當q.get(false)

非阻塞 q.put(item) 寫入佇列,timeout等待時間

q.put_nowait(item) 相當q.put(item, false)

q.task_done() 在完成一項工作之後,q.task_done() 函式向任務已經完成的佇列傳送乙個訊號

q.join() 實際上意味著等到隊列為空,再執行別的操作

1.建立佇列:

import queue

q = queue.queue(maxsize = 10)

queue.queue類即是乙個佇列的同步實現。佇列長度可為無限或者有限。可通過queue的建構函式的可選引數maxsize來設定佇列長度。如果maxsize小於1就表示佇列長度無限。

2.放入數值

q.put(nub)

範例:

實現乙個執行緒不斷生成乙個隨機數到乙個佇列中(考慮使用queue這個模組)

實現乙個執行緒從上面的佇列裡面不斷的取出奇數

實現另外乙個執行緒從上面的佇列裡面不斷取出偶數

#!/usr/bin/env python

#coding:utf8

import random,threading,time

from queue import queue

#producer thread

class producer(threading.thread):

def __init__(self, t_name, queue):

threading.thread.__init__(self,name=t_name)

self.data=queue

def run(self):

for i in range(10): #隨機產生10個數字 ,可以修改為任意大小

randomnum=random.randint(1,99)

print "%s: %s is producing %d to the queue!" % (time.ctime(), self.getname(), randomnum)

self.data.put(randomnum) #將資料依次存入佇列

time.sleep(1)

print "%s: %s finished!" %(time.ctime(), self.getname())

#consumer thread

class consumer_even(threading.thread):

def __init__(self,t_name,queue):

threading.thread.__init__(self,name=t_name)

self.data=queue

def run(self):

while 1:

try:

val_even = self.data.get(1,5) #get(self, block=true, timeout=none) ,1就是阻塞等待,5是超時5秒

if val_even%2==0:

print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(),self.getname(),val_even)

time.sleep(2)

else:

self.data.put(val_even)

time.sleep(2)

except: #等待輸入,超過5秒 就報異常

print "%s: %s finished!" %(time.ctime(),self.getname())

break

class consumer_odd(threading.thread):

def __init__(self,t_name,queue):

threading.thread.__init__(self, name=t_name)

self.data=queue

def run(self):

while 1:

try:

val_odd = self.data.get(1,5)

if val_odd%2!=0:

print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(), self.getname(), val_odd)

time.sleep(2)

else:

self.data.put(val_odd)

time.sleep(2)

except:

print "%s: %s finished!" % (time.ctime(), self.getname())

break

#main thread

def main():

queue = queue()

producer = producer('pro.', queue)

consumer_even = consumer_even('con_even.', queue)

consumer_odd = consumer_odd('con_odd.',queue)

producer.start()

consumer_even.start()

consumer_odd.start()

producer.join()

consumer_even.join()

consumer_odd.join()

print 'all threads terminate!'

if __name__ == '__main__':

main()

python常用模組介紹之二 copy模組

簡介 copy 模組主要用於複製物件,有淺 copy 和深copy 之分。首先得清楚的理解 物件 的概念 物件 python 萬物皆是物件。物件分為可變和不可變 2類,可變物件如 list,dict 等 不可變物件如 基礎型別,元組等。物件有三大特性分別為 身份 id a 型別 type a 值 a...

Python 常用模組二

import time 結構化輸出本地時間 print time.localtime time.struct time tm year 2018,tm mon 8,tm mday 27,tm hour 17,tm min 14,tm sec 21,tm wday 0,tm yday 239,tm i...

python常用模組介紹(二)

前言 一 第三方模組 二 常用模組之time 總結上一回我聊了一下關於什麼是模組,為什麼使用模組,模組的分類以及如何匯入模組。那麼今天我想聊一下常用的模組 但是,在說常用模組之前,我想先說一下第三方模組 在python中,安裝第三方模組,是通過setuptools這個工具完成的。python有兩個封...