日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python queue windows_python Queue模块

發布時間:2025/3/12 python 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python queue windows_python Queue模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

創建一個“隊列”對象

import Queue

myqueue = Queue.Queue(maxsize = 10)

Queue.Queue類即是一個隊列的同步實現。隊列長度可為無限或者有限。可通過Queue的構造函數的可選參數maxsize來設定隊列長度。如果maxsize小于1就表示隊列長度無限。

將一個值放入隊列中

myqueue.put(10)

調用隊列對象的put()方法在隊尾插入一個項目。put()有兩個參數,第一個item為必需的,為插入項目的值;第二個block為可選參數,默認為1。如果隊列當前為空且block為1,put()方法就使調用線程暫停,直到空出一個數據單元。如果block為0,put方法將引發Full異常。

將一個值從隊列中取出

myqueue.get()

調用隊列對象的get()方法從隊頭刪除并返回一個項目。可選參數為block,默認為True。如果隊列為空且block為True,get()就使調用線程暫停,直至有項目可用。如果隊列為空且block為False,隊列將引發Empty異常。

python queue模塊有三種隊列:

1、python queue模塊的FIFO隊列先進先出。

2、LIFO類似于堆。即先進后出。

3、還有一種是優先級隊列級別越低越先出來。

針對這三種隊列分別有三個構造函數:

1、class Queue.Queue(maxsize) FIFO

2、class Queue.LifoQueue(maxsize) LIFO

3、class Queue.PriorityQueue(maxsize) 優先級隊列

介紹一下此包中的常用方法:

Queue.qsize() 返回隊列的大小

Queue.empty() 如果隊列為空,返回True,反之False

Queue.full() 如果隊列滿了,返回True,反之False

Queue.full 與 maxsize 大小對應

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

Queue.get_nowait() 相當Queue.get(False)

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

Queue.put_nowait(item) 相當Queue.put(item, False)

Queue.task_done() 在完成一項工作之后,Queue.task_done()函數向任務已經完成的隊列發送一個信號

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

附上一個例子:

#coding:utf-8

import Queue

import threading

import time

import random

q = Queue.Queue(0) #當有多個線程共享一個東西的時候就可以用它了

NUM_WORKERS = 3

class MyThread(threading.Thread):

def __init__(self,input,worktype):

self._jobq = input

self._work_type = worktype

threading.Thread.__init__(self)

def run(self):

while True:

if self._jobq.qsize() > 0:

self._process_job(self._jobq.get(),self._work_type)

else:break

def _process_job(self, job, worktype):

doJob(job,worktype)

def doJob(job, worktype):

time.sleep(random.random() * 3)

print"doing",job," worktype ",worktype

if __name__ == '__main__':

print "begin...."

for i inrange(NUM_WORKERS * 2):

q.put(i) #放入到任務隊列中去

print "job qsize:",q.qsize()

for x inrange(NUM_WORKERS):

MyThread(q,x).start()一些需要注意的地方:

1. 阻塞模式

importQueue

q = Queue.Queue(10)

......

fori in range(10):

q.put('A')

time.sleep(0.5)

這是一段極其簡單的代碼(另有兩個線程也在操作隊列q),我期望每隔0.5秒寫一個'A'到隊列中,但總是不能如愿:間隔時間有時會遠遠超過0.5秒。原來,Queue.put()默認有 block = True 和 timeou 兩個參數。當? block = True 時,寫入是阻塞式的,阻塞時間由 timeou? 確定。當隊列q被(其他線程)寫滿后,這段代碼就會阻塞,直至其他線程取走數據。Queue.put()方法加上 block=False 的參數,即可解決這個隱蔽的問題。但要注意,非阻塞方式寫隊列,當隊列滿時會拋出 exception Queue.Full 的異常。

2. 無法捕獲 exception Queue.Empty 的異常

whileTrue:

......

try:

data = q.get()

exceptQueue.Empty:

break

我的本意是用隊列為空時,退出循環,但實際運行起來,卻陷入了死循環。這個問題和上面有點類似:Queue.get()默認的也是阻塞方式讀取數據,隊列為空時,不會拋出 except Queue.Empty ,而是進入阻塞直至超時。 加上block=False 的參數,問題迎刃而解。

總結

以上是生活随笔為你收集整理的python queue windows_python Queue模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。