tornado.queues
– コルーチン用のキュー¶
バージョン4.2の新機能。
コルーチン用の非同期キュー。これらのクラスは、標準ライブラリのasyncioパッケージで提供されているものと非常に似ています。
警告
標準ライブラリのqueue
モジュールとは異なり、ここで定義されているクラスはスレッドセーフではありません。別のスレッドからこれらのキューを使用するには、IOLoop.add_callback
を使用して、キューメソッドを呼び出す前にIOLoop
スレッドに制御を移してください。
クラス¶
Queue¶
- class tornado.queues.Queue(maxsize: int = 0)[source]¶
プロデューサーとコンシューマーのコルーチンを調整します。
maxsizeが0の場合(デフォルト)、キューサイズは無制限です。
import asyncio from tornado.ioloop import IOLoop from tornado.queues import Queue q = Queue(maxsize=2) async def consumer(): async for item in q: try: print('Doing work on %s' % item) await asyncio.sleep(0.01) finally: q.task_done() async def producer(): for item in range(5): await q.put(item) print('Put %s' % item) async def main(): # Start consumer without waiting (since it never finishes). IOLoop.current().spawn_callback(consumer) await producer() # Wait for producer to put all tasks. await q.join() # Wait for consumer to finish all tasks. print('Done') asyncio.run(main())
Put 0 Put 1 Doing work on 0 Put 2 Doing work on 1 Put 3 Doing work on 2 Put 4 Doing work on 3 Doing work on 4 Done
ネイティブコルーチンがないPythonのバージョン(3.5より前)では、
consumer()
は次のように記述できます。@gen.coroutine def consumer(): while True: item = yield q.get() try: print('Doing work on %s' % item) yield gen.sleep(0.01) finally: q.task_done()
バージョン4.3での変更: Python 3.5で
async for
サポートを追加しました。- put(item: _T, timeout: Optional[Union[float, timedelta]] = None) Future[None] [source]¶
アイテムをキューに入れます。空きができるまで待つ場合があります。
tornado.util.TimeoutError
をタイムアウト後に発生させるFutureを返します。timeout
は、tornado.ioloop.IOLoop.time
と同じスケール(通常はtime.time
)の数値、または現在の時刻からの期限を示すdatetime.timedelta
オブジェクトです。
- get(timeout: Optional[Union[float, timedelta]] = None) Awaitable[_T] [source]¶
キューからアイテムを削除して返します。
アイテムが利用可能になると解決される、またはタイムアウト後に
tornado.util.TimeoutError
を発生させるawaitableを返します。timeout
は、tornado.ioloop.IOLoop.time
と同じスケール(通常はtime.time
)の数値、または現在の時刻からの期限を示すdatetime.timedelta
オブジェクトです。注記
このメソッドの
timeout
引数は、標準ライブラリのqueue.Queue.get
のものとは異なります。そのメソッドは数値を相対的なタイムアウトとして解釈しますが、これは絶対的な期限として解釈し、相対的なタイムアウトにはtimedelta
オブジェクトが必要です(Tornadoの他のタイムアウトと一貫性があります)。
- get_nowait() _T [source]¶
ブロッキングせずにキューからアイテムを削除して返します。
アイテムがすぐに利用可能な場合はアイテムを返し、そうでない場合は
QueueEmpty
を発生させます。
PriorityQueue¶
- class tornado.queues.PriorityQueue(maxsize: int = 0)[source]¶
優先順位順(低い順)にエントリを取得する
Queue
です。エントリは通常、
(priority number, data)
のようなタプルです。import asyncio from tornado.queues import PriorityQueue async def main(): q = PriorityQueue() q.put((1, 'medium-priority item')) q.put((0, 'high-priority item')) q.put((10, 'low-priority item')) print(await q.get()) print(await q.get()) print(await q.get()) asyncio.run(main())
(0, 'high-priority item') (1, 'medium-priority item') (10, 'low-priority item')
LifoQueue¶
例外¶
QueueEmpty¶
- exception tornado.queues.QueueEmpty[source]¶
キューにアイテムがない場合、
Queue.get_nowait
によって発生します。
QueueFull¶
- exception tornado.queues.QueueFull[source]¶
キューが最大サイズに達した場合、
Queue.put_nowait
によって発生します。