gpt4 book ai didi

python-3.x - Asyncio Queue 等待直到它已满,然后才会返回某些内容

转载 作者:行者123 更新时间:2023-12-04 12:01:12 25 4
gpt4 key购买 nike

我遇到了一个奇怪的问题 asyncio.Queue - 队列不是在项目可用时立即返回,而是在返回任何内容之前等待它已满。我意识到在使用队列来存储从 cv2.VideoCapture 收集的帧时, maxsize 越大队列的长度越长,在屏幕上显示任何内容所需的时间越长,然后,它看起来像是收集到队列中的所有帧的序列。
这是一个功能,一个错误,还是我只是用错了?
无论如何,这是我的代码

import asyncio  
import cv2
import numpy as np


async def collecting_loop(queue):
print("cl")
cap = cv2.VideoCapture(0)
while True:
_, img = cap.read()
await queue.put(img)


async def processing_loop(queue):
print("pl")
await asyncio.sleep(0.1)
while True:
img = await queue.get()
cv2.imshow('img', img)
cv2.waitKey(5)


async def main(e_loop):
print("running main")
queue = asyncio.Queue(loop=e_loop, maxsize=10)
await asyncio.gather(collecting_loop(queue), processing_loop(queue))


loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main(e_loop=loop))
except KeyboardInterrupt:
pass
finally:
loop.close()

最佳答案

Is [the queue getter not waking up until the queue fills up] a feature, a bug, or am i just using this wrong?



你使用它是错误的,但以一种微妙的方式。正如安德鲁解释的那样, queue.put不保证任务切换,收集器协程只运行阻塞代码和 queue.put .尽管封锁很短,但 asyncio 并不知道这一点,并认为您正在调用 queue.put在一个非常紧密的循环中。队列 getter 在队列填满之前根本没有机会运行。

集成 asyncio 和 cv 的正确方法是在单独的线程中运行 cv 代码并让 asyncio 事件循环等待它完成。 run_in_executor方法使这变得非常简单:
async def collecting_loop(queue):  
print("cl")
loop = asyncio.get_event_loop()
cap = cv2.VideoCapture(0)
while True:
_, img = await loop.run_in_executor(None, cap.read)
await queue.put(img)
run_in_executor将在等待新帧时自动挂起收集器协程,以便及时处理排队的帧。

关于python-3.x - Asyncio Queue 等待直到它已满,然后才会返回某些内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49333088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com