Python异步IO队列未更新
下面的代码实例化了一个Python异步IO队列未更新,python,queue,python-asyncio,Python,Queue,Python Asyncio,下面的代码实例化了一个asyncio.Queue对象,并尝试从两个不同的协同程序(分别是arrival()和server())填充和使用该队列 原则如下: 每隔1秒,一个项目被添加到q 只要服务器空闲,它就会接收或等待队列中的下一项 服务器处理项目需要1.8秒 预期产出将是: SERVER - Queue id: 12345678 ARRIVAL - Queue id: 12345678 ARRIVAL - added item1, qsize is now 1 SERVER - takin
asyncio.Queue
对象,并尝试从两个不同的协同程序(分别是arrival()
和server()
)填充和使用该队列
原则如下:
- 每隔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
但是,当我运行上述代码时,中的元素在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
...
我以你想要的方式运行了它:
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
...
TL&DR:确保在使用异步IO队列时同时等待put()和get()
Rational:在异步IO队列中的get()和put()函数中,它们都是共同例程,因此需要等待
示例:
await q.put(item)
await q.get(item)
TL&DR:确保在使用异步IO队列时同时等待put()和get()
Rational:在异步IO队列中的get()和put()函数中,它们都是共同例程,因此需要等待
示例:
await q.put(item)
await q.get(item)
谢谢有意义的位调用的是wait q.put(item)
,而不是q.put(item)
。这是有道理的,因为q.put
是一个协同程序,但不知何故我错过了它。@Jivan是的,想补充一点,这是我改变的更重要的事情之一。。。对不起新年快乐!另一方面,用asyncio.wait()
替换asyncio.gather()。我应该调查文件中的差异。新年快乐!谢谢有意义的位调用的是wait q.put(item)
,而不是q.put(item)
。这是有道理的,因为q.put
是一个协同程序,但不知何故我错过了它。@Jivan是的,想补充一点,这是我改变的更重要的事情之一。。。对不起新年快乐!另一方面,用asyncio.wait()
替换asyncio.gather()。我应该调查文件中的差异。新年快乐!