Python asyncio队列未更新

吉万

以下代码实例化一个asyncio.Queue对象,并尝试从两个不同的协程(分别为arrival()和)填充和使用此队列server()

loop = asyncio.get_event_loop()
q = asyncio.Queue()

async def arrival(q):
    print('ARRIVAL - Queue id:', id(q))

    while True:
        await asyncio.sleep(1)
        item = random.choice(['item1', 'item2'..., 'item100'])
        q.put(item)

        print('ARRIVAL - added {}, qsize is now {}'.format(item, q.qsize()))


async def server(q):
    print('SERVER - Queue id:', id(q))

    while True:
        item = await q.get()
        print('SERVER - taking {}, qsize is now {}'.format(item, q.qsize()))

        await asyncio.sleep(1.8)
        print('SERVER - finished processing {}'.format(item))


tasks = [loop.create_task(arrival(q)), loop.create_task(server(q))]
loop.run_until_complete(asyncio.gather(*tasks))

原理如下:

  • 每1秒将一个项目添加到 q
  • 每当服务器空闲时,它将获取队列中的下一项或等待它
  • 服务器需要1.8秒来处理项目

预期的输出将是:

SERVER - Queue id: 12345678
ARRIVAL - Queue id: 12345678
ARRIVAL - added item1, qsize is now 1
SERVER - taking item1, qsize is now 0
ARRIVAL - added item2, qsize is now 1
SERVER - finished processing item1
SERVER - taking item2, qsize is now 0
ARRIVAL - added item3, qsize is now 1
ARRIVAL - added item4, qsize is now 2
SERVER - finished processing item2
SERVER - taking item3, qsize is now 1
ARRIVAL - added item5, qsize is now 2
ARRIVAL - added item6, qsize is now 3
SERVER - finished processing item3
SERVER - taking item4, qsize is now 2

但是,当我运行上面的代码时,while True循环中的元素server()永远不会执行,q.qsize()始终为0,输出为:

SERVER - Queue id: 12345678
ARRIVAL - Queue id: 12345678
ARRIVAL - added item1, qsize is now 0
ARRIVAL - added item2, qsize is now 0
ARRIVAL - added item3, qsize is now 0
ARRIVAL - added item4, qsize is now 0
ARRIVAL - added item5, qsize is now 0
...

似乎该q对象永远不会由arrival()q.qsize()始终为0)更新,因此server()永远不会知道由添加的项arrival()

弘主角

我以您希望的方式运行它:

import asyncio
import random

random.seed(31415)  # get reproducible runs

ITEMS = ['item{}'.format(i) for i in range(100)]

async def arrival(q):
    queue_object_id = id(q)
    print('ARRIVAL - Queue id:', queue_object_id)
    while True:
        await asyncio.sleep(1)
        item = random.choice(ITEMS)
        await q.put(item)
        size = q.qsize()
        print('ARRIVAL - added {}, qsize is now {}'.format(item, size))

async def server(q):
    queue_object_id = id(q)
    print('SERVER - Queue id:', queue_object_id)

    while True:
        item = await q.get()
        size = q.qsize()
        print('SERVER - taking {}, qsize is now {}'.format(item, size))
        await asyncio.sleep(1.8)
        print('SERVER - finished processing {}'.format(item))

loop = asyncio.get_event_loop()
q = asyncio.Queue()
cors = asyncio.wait([arrival(q), server(q)])
loop.run_until_complete(cors)

不幸的是,我没有跟踪我必须进行的所有更改...对不起。但我敢肯定,您会发现其中的差异以及它们为何会有所不同。

这将产生输出:

SERVER - Queue id: 140540011741592
ARRIVAL - Queue id: 140540011741592
ARRIVAL - added item75, qsize is now 1
SERVER - taking item75, qsize is now 0
ARRIVAL - added item36, qsize is now 1
SERVER - finished processing item75
SERVER - taking item36, qsize is now 0
ARRIVAL - added item57, qsize is now 1
ARRIVAL - added item5, qsize is now 2
SERVER - finished processing item36
SERVER - taking item57, qsize is now 1
ARRIVAL - added item69, qsize is now 2
ARRIVAL - added item67, qsize is now 3
SERVER - finished processing item57
SERVER - taking item5, qsize is now 2
ARRIVAL - added item53, qsize is now 3
ARRIVAL - added item16, qsize is now 4
SERVER - finished processing item5
SERVER - taking item69, qsize is now 3
ARRIVAL - added item91, qsize is now 4
...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python asyncio队列未显示任何异常

来自分类Dev

重复的 python id,当使用 asyncio 队列时

来自分类Dev

python multiprocessing队列未正确并行化

来自分类Dev

具有更新队列和输出队列的Python多处理

来自分类Dev

Python WebScraper 未更新

来自分类Dev

Python全局列表未更新

来自分类Dev

Python全局列表未更新

来自分类Dev

更新优先级队列 python Dijkstras 算法

来自分类Dev

多个串行队列,UI未更新

来自分类Dev

Python-字典未正确更新

来自分类Dev

Python:环境变量未更新

来自分类Dev

Python Gremlin中的顶点未更新

来自分类Dev

Python SQLITE Update子句未更新

来自分类Dev

Python Tkinter标签小部件未更新

来自分类Dev

python的tkinter按钮颜色更改未更新

来自分类Dev

python包未使用pip更新

来自分类Dev

Python-字典文件未更新

来自分类Dev

未更新的全局变量 Python 列表

来自分类Dev

全局数据框未更新python

来自分类Dev

Python 字典中键的值未更新

来自分类Dev

使用 python 代码的未更新行

来自分类Dev

python数据库请求未更新

来自分类Dev

python类属性在函数中更新时未更新

来自分类Dev

使用aa管理器更新Python多进程中的队列

来自分类Dev

使用python只更新队列中第一次出现的对象而不会中断

来自分类Dev

Python队列组合

来自分类Dev

Python队列模块卡住

来自分类Dev

Python 3线程,队列

来自分类Dev

Python队列组合