V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ryanking8215
V2EX  ›  Python

asyncio 的 queue.get()问题

  •  
  •   ryanking8215 ·
    ryanking8215 · 2016-01-08 11:25:43 +08:00 · 3269 次点击
    这是一个创建于 3260 天前的主题,其中的信息可能已经有所发展或是发生改变。

    描述

    python3.4 环境
    - 任务 1 往 queue 每隔 2s 塞一个数据
    - 任务 2 使用一个循环, 1s 超时获取 queue 数据。

    现象: 任务 2 一直得不到数据。, 从原则上说,这把 get()超时了,只要 put()过了,下一把 get 怎么也能得到数据。但就是没有数据,一直超时。

    任务 2 为什么不一直 yield from queue.get()呢?一直 yield from 当然可以得到,问题就是这个 asyncio.wait_for()超时会得不到, timeout=1 得不到, timeout=0.5 是 ok 的, >2 是 ok 的,=2 也是得不到的。

    代码

    import asyncio
    
    #from queues import Queue
    
    class Test:
        def __init__(self, loop=None):
            self._queue = asyncio.Queue(loop=loop)
            self._future = asyncio.Future(loop=loop)
    
        @asyncio.coroutine
        def run(self):
            asyncio.async(self._feed_queue(2))
            asyncio.async(self._recv())
    
        @asyncio.coroutine
        def _feed_queue(self, interval):
            v = 0
            while True:
                yield from asyncio.sleep(interval)
                print("feed")
                yield from self._queue.put(v)
                v = v+1
                # print("%s" % repr(self._queue))
    
    
        @asyncio.coroutine
        def _recv(self):
    
            while True:
                # print('wait')
                try:
                    r = yield from asyncio.wait_for(self._queue.get(), timeout=1.0)
                    print(">>>>>>>>>>>>>>>",r)
                except asyncio.TimeoutError:
                    print("timeout")
                    continue
                except:
                    break
    
            print("quit")
    
    
    loop = asyncio.get_event_loop()
    t = Test(loop=loop)
    asyncio.async(t.run())
    loop.run_forever()
    
    第 1 条附言  ·  2016-01-08 12:06:16 +08:00
    python3.5.1 已经修正了
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1093 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:27 · PVG 07:27 · LAX 15:27 · JFK 18:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.