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

歡迎訪問 生活随笔!

生活随笔

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

python

python队列只能一个个读取吗_python队列Queue的详解

發布時間:2024/7/5 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python队列只能一个个读取吗_python队列Queue的详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Queue

Queue是python標準庫中的線程安全的隊列(FIFO)實現,提供了一個適用于多線程編程的先進先出的數據結構,即隊列,用來在生產者和消費者線程之間的信息傳遞

基本FIFO隊列

class Queue.Queue(maxsize=0)

FIFO即First in First Out,先進先出。Queue提供了一個基本的FIFO容器,使用方法很簡單,maxsize是個整數,指明了隊列中能存放的數據個數的上限。一旦達到上限,插入會導致阻塞,直到隊列中的數據被消費掉。如果maxsize小于或者等于0,隊列大小沒有限制。

舉個栗子:

import Queue

q = Queue.Queue()

for i in range(5):

q.put(i)

while not q.empty():

print q.get()

輸出:

0

1

2

3

4

LIFO隊列

class Queue.LifoQueue(maxsize=0)

LIFO即Last in First Out,后進先出。與棧的類似,使用也很簡單,maxsize用法同上

再舉個栗子:

import Queue

q = Queue.LifoQueue()

for i in range(5):

q.put(i)

while not q.empty():

print q.get()

輸出:

4

3

2

1

0

可以看到僅僅是將Queue.Quenu類替換為Queue.LifiQueue類

優先級隊列

class Queue.PriorityQueue(maxsize=0)

構造一個優先隊列。maxsize用法同上。

import Queue

import threading

class Job(object):

def __init__(self, priority, description):

self.priority = priority

self.description = description

print 'Job:',description

return

def __cmp__(self, other):

return cmp(self.priority, other.priority)

q = Queue.PriorityQueue()

q.put(Job(3, 'level 3 job'))

q.put(Job(10, 'level 10 job'))

q.put(Job(1, 'level 1 job'))

def process_job(q):

while True:

next_job = q.get()

print 'for:', next_job.description

q.task_done()

workers = [threading.Thread(target=process_job, args=(q,)),

threading.Thread(target=process_job, args=(q,))

]

for w in workers:

w.setDaemon(True)

w.start()

q.join()

結果

Job: level 3 job

Job: level 10 job

Job: level 1 job

for: level 1 job

for: level 3 job

for: job: level 10 job

一些常用方法

task_done()

意味著之前入隊的一個任務已經完成。由隊列的消費者線程調用。每一個get()調用得到一個任務,接下來的task_done()調用告訴隊列該任務已經處理完畢。

如果當前一個join()正在阻塞,它將在隊列中的所有任務都處理完時恢復執行(即每一個由put()調用入隊的任務都有一個對應的task_done()調用)。

join()

阻塞調用線程,直到隊列中的所有任務被處理掉。

只要有數據被加入隊列,未完成的任務數就會增加。當消費者線程調用task_done()(意味著有消費者取得任務并完成任務),未完成的任務數就會減少。當未完成的任務數降到0,join()解除阻塞。

put(item[, block[, timeout]])

將item放入隊列中。

如果可選的參數block為True且timeout為空對象(默認的情況,阻塞調用,無超時)。

如果timeout是個正整數,阻塞調用進程最多timeout秒,如果一直無空空間可用,拋出Full異常(帶超時的阻塞調用)。

如果block為False,如果有空閑空間可用將數據放入隊列,否則立即拋出Full異常

其非阻塞版本為put_nowait等同于put(item, False)

get([block[, timeout]])

從隊列中移除并返回一個數據。block跟timeout參數同put方法

其非阻塞方法為`get_nowait()`相當與get(False)

empty()

如果隊列為空,返回True,反之返回False

以上所述是小編給大家介紹的python隊列Queue詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

總結

以上是生活随笔為你收集整理的python队列只能一个个读取吗_python队列Queue的详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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