当前位置: 首页 > 文档资料 > Tornado 用户手册 >

tornado.queues – Queues for coroutines

优质
小牛编辑
141浏览
2023-12-01

4.2 新版功能.

Classes

Queue

class tornado.queues.Queue(maxsize=0)

Coordinate producer and consumer coroutines.

If maxsize is 0 (the default) the queue size is unbounded.

from tornado import gen
from tornado.ioloop import IOLoop
from tornado.queues import Queue

q = Queue(maxsize=2)

@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()

@gen.coroutine
def producer():
    for item in range(5):
        yield q.put(item)
        print('Put %s' % item)

@gen.coroutine
def main():
    # Start consumer without waiting (since it never finishes).
    IOLoop.current().spawn_callback(consumer)
    yield producer()     # Wait for producer to put all tasks.
    yield q.join()       # Wait for consumer to finish all tasks.
    print('Done')

IOLoop.current().run_sync(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

In Python 3.5, implements the async iterator protocol, so consumer() could be rewritten as:

async def consumer():
    async for item in q:
        try:
            print('Doing work on %s' % item)
            yield gen.sleep(0.01)
        finally:
            q.task_done()

在 4.3 版更改: Added async for support in Python 3.5.

maxsize

Number of items allowed in the queue.

qsize()

Number of items in the queue.

put(item, timeout=None)

Put an item into the queue, perhaps waiting until there is room.

Returns a Future, which raises after a timeout.

put_nowait(item)

Put an item into the queue without blocking.

If no free slot is immediately available, raise .

get(timeout=None)

Remove and return an item from the queue.

Returns a Future which resolves once an item is available, or raises after a timeout.

get_nowait()

Remove and return an item from the queue without blocking.

Return an item if one is immediately available, else raise .

task_done()

Indicate that a formerly enqueued task is complete.

Used by queue consumers. For each used to fetch a task, a subsequent call to tells the queue that the processing on the task is complete.

If a is blocking, it resumes when all items have been processed; that is, when every is matched by a .

Raises if called more times than .

join(timeout=None)

Block until all items in the queue are processed.

Returns a Future, which raises after a timeout.

PriorityQueue

class tornado.queues.PriorityQueue(maxsize=0)

A that retrieves entries in priority order, lowest first.

Entries are typically tuples like (priority number, data).

from tornado.queues import PriorityQueue

q = PriorityQueue()
q.put((1, 'medium-priority item'))
q.put((0, 'high-priority item'))
q.put((10, 'low-priority item'))

print(q.get_nowait())
print(q.get_nowait())
print(q.get_nowait())
(0, 'high-priority item')
(1, 'medium-priority item')
(10, 'low-priority item')

LifoQueue

class tornado.queues.LifoQueue(maxsize=0)

A that retrieves the most recently put items first.

from tornado.queues import LifoQueue

q = LifoQueue()
q.put(3)
q.put(2)
q.put(1)

print(q.get_nowait())
print(q.get_nowait())
print(q.get_nowait())
1
2
3

Exceptions

QueueEmpty

exception tornado.queues.QueueEmpty

Raised by when the queue has no items.

QueueFull

exception tornado.queues.QueueFull

Raised by when a queue is at its maximum size.