Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python异步IO队列未更新_Python_Queue_Python Asyncio - Fatal编程技术网

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()。我应该调查文件中的差异。新年快乐!