ホームページ  >  記事  >  バックエンド開発  >  Pythonのキューモジュールの詳しい説明

Pythonのキューモジュールの詳しい説明

巴扎黑
巴扎黑オリジナル
2017-07-19 13:16:572266ブラウズ

Queue

Queue は、Python 標準ライブラリのスレッド セーフ キュー (FIFO) 実装であり、マルチスレッド プログラミングに適した先入れ先出しデータ構造、つまりプロデューサーとの間で使用されるキューを提供します。情報転送

基本的な FIFO キュー

class Queue.Queue(maxsize=0)

FIFO は先入れ先出しです。 Queue は、非常に簡単に使用できる基本的な FIFO コンテナを提供します。 maxsize は、キューに保存できるデータ数の上限を指定する整数です。制限に達すると、キュー内のデータが消費されるまで挿入によってブロックが発生します。 maxsize が 0 以下の場合、キューのサイズに制限はありません。

例:

1 import Queue2 3 q = Queue.Queue()4 5 for i in range(5):6     q.put(i)7 8 while not q.empty():9     print q.get()

出力:

01
2
3
4

LIFO queue

class Queue.LifoQueue(maxsize=0)

LIFOは後入れ先出し、イン、ファーストアウト。スタックと同様に、maxsize の使用法は上記と同じです:

1 import Queue2 3 q = Queue.LifoQueue()4 5 for i in range(5):6     q.put(i)7 8 while not q.empty():9     print q.get()

出力:

4
3
2
10

だけであることがわかります。 Queue.Quenu クラスQueue.LifiQueue クラスに置き換えられました

Priority QueueQueue.Quenu类替换为Queue.LifiQueue类

优先级队列

class Queue.PriorityQueue(maxsize=0)

构造一个优先队列。maxsize用法同上。

import Queueimport threadingclass Job(object):def __init__(self, priority, description):
        self.priority = priority
        self.description = descriptionprint 'Job:',descriptionreturndef __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 jobfor: level 1 jobfor: level 3 jobfor: job: level 10 job

 

一些常用方法

task_done()

意味着之前入队的一个任务已经完成。由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。

如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。

join()

阻塞调用线程,直到队列中的所有任务被处理掉。

只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞。

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

将item放入队列中。

  1. 如果可选的参数block为True且timeout为空对象(默认的情况,阻塞调用,无超时)。

  2. 如果timeout是个正整数,阻塞调用进程最多timeout秒,如果一直无空空间可用,抛出Full异常(带超时的阻塞调用)。

  3. 如果block为False,如果有空闲空间可用将数据放入队列,否则立即抛出Full异常

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

get([block[, timeout]])

从队列中移除并返回一个数据。block跟timeout参数同put方法

其非阻塞方法为`get_nowait()`相当与get(False)

class Queue.PriorityQueue(maxsize=0)

優先キューを構築します。 maxsize の使用方法は上記と同じです。 🎜🎜rrreee🎜🎜 🎜🎜いくつかの一般的なメソッド 🎜🎜🎜task_done()🎜🎜🎜 は、以前にキューに入れられたタスクが完了したことを意味します。キューのコンシューマ スレッドによって呼び出されます。各 get() 呼び出しはタスクを取得し、次の task_done() 呼び出しはタスクが処理されたことをキューに伝えます。 🎜🎜現在の join() がブロックしている場合、キュー内のすべてのタスクが処理されると実行が再開されます (つまり、put() 呼び出しによってキューに入れられた各タスクには、対応する task_done() 呼び出しがあります)。 🎜🎜🎜join()🎜🎜🎜 は、キュー内のすべてのタスクが処理されるまで呼び出しスレッドをブロックします。 🎜🎜キューにデータが追加される限り、未完了のタスクの数は増加します。コンシューマ スレッドが task_done() を呼び出すと (コンシューマがタスクを取得してタスクを完了することを意味します)、未完了のタスクの数が減ります。未完了のタスクの数が 0 になると、join() のブロックが解除されます。 🎜🎜🎜put(item[, block[, timeout]])🎜🎜🎜アイテムをキューに入れます。 🎜
  1. 🎜 オプションのパラメーター block が True で、timeout が空のオブジェクトの場合 (デフォルト、呼び出しをブロックし、タイムアウトなし)。 🎜
  2. 🎜 timeout が正の整数の場合、呼び出しプロセスは最大 timeout 秒間ブロックされます。利用可能な空き領域がない場合は、完全な例外 (タイムアウトによる呼び出しのブロック) がスローされます。 🎜
  3. 🎜block が False の場合、利用可能な空き領域がある場合はデータをキューに入れます。そうでない場合は、すぐに完全な例外がスローされます🎜
🎜 非ブロッキング バージョンput_nowait put(item, False) と同等です🎜🎜🎜get([block[, timeout]])🎜🎜🎜はキューから削除し、データの一部を返します。ブロックおよびタイムアウトのパラメーターは put メソッドと同じです🎜🎜非ブロッキング メソッドは `get_nowait()` であり、get(False) と同等です🎜🎜empty ()🎜🎜キューが空の場合は True を返し、それ以外の場合は False を返します🎜

以上がPythonのキューモジュールの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。