协程的队列

协调生产者消费者协程.

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

在Python 3.5, Queue 实现了异步迭代器协议, 所以 consumer() 可以被重写为:

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 版更改: 为Python 3.5添加 async for 支持 in Python 3.5.

maxsize

  队列中允许的最大项目数.

qsize()[源代码]

  当前队列中的项目数.

put(itemtimeout=None)[源代码]

  将一个项目放入队列中, 可能需要等待直到队列中有空间.

  返回一个Future对象, 如果超时会抛出 tornado.gen.TimeoutError .

put_nowait(item)[源代码]

  非阻塞的将一个项目放入队列中.

  如果没有立即可用的空闲插槽, 则抛出 QueueFull.

get(timeout=None)[源代码]

  从队列中删除并返回一个项目.

  返回一个Future对象, 当项目可用时resolve, 或者在超时后抛出 tornado.gen.TimeoutError .

get_nowait()[源代码]

  非阻塞的从队列中删除并返回一个项目.

  如果有项目是立即可用的则返回该项目, 否则抛出 QueueEmpty.

task_done()[源代码]

  表明前面排队的任务已经完成.

  被消费者队列使用. 每个 get 用来获取一个任务, 随后(subsequent) 调用 task_done 告诉队列正在处理的任务已经完成.

  如果 join 正在阻塞, 它会在所有项目都被处理完后调起; 即当每个 put 都被一个 task_done匹配.

  如果调用次数超过 put 将会抛出 ValueError .

join(timeout=None)[源代码]

  阻塞(block)直到队列中的所有项目都处理完.

  返回一个Future对象, 超时后会抛出 tornado.gen.TimeoutError 异常.

Exceptions

QueueEmpty

  exception tornado.queues.QueueEmpty[源代码]

  当队列中没有项目时, 由 Queue.get_nowait 抛出.

QueueFull

  exception tornado.queues.QueueFull[源代码]

  当队列为最大size时, 由 Queue.put_nowait 抛出.

Python开发【模块】:tornado.queues协程的队列的更多相关文章

  1. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  2. python并发编程之线程/协程

    python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...

  3. Python PEP 492 中文翻译——协程与async/await语法

    原文标题:PEP 0492 -- Coroutines with async and await syntax 原文链接:https://www.python.org/dev/peps/pep-049 ...

  4. Python并发编程系列之协程

    1 引言 协程是近几年并发编程的一个热门话题,与Python多进程.多线程相比,协程在很多方面优势明显.本文从协程的定义和意义出发,结合asyncio模块详细讲述协程的使用. 2 协程的意义 2.1 ...

  5. Python开发【Tornado】:异步Web服务(二)

    真正的 Tornado 异步非阻塞 前言: 其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Torn ...

  6. Python 多线程、进程、协程上手体验

    浅谈 Python 多线程.进程.协程上手体验 前言:浅谈 Python 很多人都认为 Python 的多线程是垃圾(GIL 说这锅甩不掉啊~):本章节主要给你体验下 Python 的两个库 Thre ...

  7. python进阶(17)协程

    协程 协程(Coroutine),又称微线程,纤程.(协程是一种用户态的轻量级线程)   作用:在执行 A 函数的时候,可以随时中断,去执行 B 函数,然后中断B函数,继续执行 A 函数 (可以自动切 ...

  8. python进阶(25)协程

    协程的定义 协程(Coroutine),又称微线程,纤程.(协程是一种用户态的轻量级线程) 作用:在执行 A 函数的时候,可以随时中断,去执行 B 函数,然后中断B函数,继续执行 A 函数 (可以自动 ...

  9. python并发编程之gevent协程(四)

    协程的含义就不再提,在py2和py3的早期版本中,python协程的主流实现方法是使用gevent模块.由于协程对于操作系统是无感知的,所以其切换需要程序员自己去完成. 系列文章 python并发编程 ...

随机推荐

  1. File 类的 getCanonicalFile( ) 和 getAbsoluteFile( ) 区别

    一.打开java.io.File源码,看下两个方法的区别 getAbsoluteFile public File getAbsoluteFile() { String absPath = getAbs ...

  2. 重新入坑-IntelliJ Maven

    写Restful的服务,使用IntelliJ+maven,发现有几个依赖总是没法配置好.通过检查POM.xml,发现犯了错误,<dependency>写到了<dependencies ...

  3. Ubuntu16.04搭建Postfix作为SMTP服务器

    一.DNS配置 类型 名称  值  TTL   A mail  128.199.254.32  1小时  MX  @ mail.example.com(优先:10) 1小时  TXT @  v=spf ...

  4. input 手机号

    关于input手机号的验证 一.手机号的判断方法: function isPhoneTel(n){ var reg = /^1[3|4|5|8]\d{9}$/; if(!!(reg.test(n))) ...

  5. excel中批量删除公式,保留数值

    excel中批量删除公式,保留数值 Sub macro1() Dim sh As Worksheet For Each sh In Sheets sh.UsedRange = sh.UsedRange ...

  6. Redhat6.5——解决yum功能不能正常使用

    以前或多或少接触过linux服务器,由于是服务器上的,很多东西也没去玩过.要想多研究,还是得自己弄一个linux系统.由于正常工作,还是接触windows更多,双系统显然没有那么方便,所以决定弄个虚拟 ...

  7. Texture::setUnRefImageDataAfterApply

    当该值设置为true时,OSG在应用过该纹理对象后(apply),自动释放其对Image对象的引用,以减少内存占用

  8. 面试题思考:GET和POST两种基本请求方法的区别

    面试回答: GET请求在URL中传送的参数是有长度限制的,而POST没有. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息. GET参数通过URL传递,POST放在Re ...

  9. linux下mysql 文件导入导出

    最近在做mysql的数据导入导出得到的一些经验,记录下. 1.首先要开通导入导出的功能,需要设置一个mysql的配置 可以在 my.conf 文件的最后增加配置项 secure-file-priv=' ...

  10. error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2

    使用VS2013版本引用外部的lib进行编译时候提示: 错误 25 error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:  值“0”不匹配值“2”(jrtpl ...