运行 在 While 循环中使用异步协程 Python
Running coroutine with async in While loop Python
我正在为水下航行器编写推理系统,有人告诉我研究异步以改进对象跟踪。这个想法是有一个 tflite 对象检测模型来检测对象和 returns 一个 box/coordinates 它检测到的每个对象,然后 meanshift (或一些其他跟踪算法然后用来跟踪对象)。然而,tflite 模型需要大约 1 秒的时间来进行检测,这太慢了。所以我想 运行 在一个单独的线程中,当 meanshift 正在跟踪时,只要 tflite 模型完成,它就会更新要跟踪的框。那样的话,我假设我们会进行顺利的检测和跟踪。
我发现异步有点棘手,不太正确。出于测试目的,我创建了一个具有 5 秒延迟的推理函数,以清楚地模拟推理所需的时间,并创建了一个连续运行的跟踪函数来模拟 meanshift。这是我目前所拥有的:
async def inference(x):
await asyncio.sleep(x)
return "===========Inference Done================= "
def tracking():
print("tracking...")
def start_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()
# start the object detection model before
box = asyncio.run_coroutine_threadsafe(inference(5), new_loop)
while True:
if box: # if the object detection has detected an object and return a bounding box, track it
tracking()
if box.done(): # if the tflite has completed its detection, start the next detection
box = asyncio.run_coroutine_threadsafe(inference(5), new_loop)
print(box.result())
此处的预期输出是 tracking...
连续打印,===========Inference Done=================
每 5 秒打印一次。然而,发生的是 tracking...
连续运行 5 秒,然后它开始这样做:
tracking...
tracking...
tracking...
tracking...
tracking...
tracking...
tracking...
tracking...
===========Inference Done=================
tracking...
===========Inference Done=================
tracking...
我该如何解决这个问题?
你的奇怪输出是因为 print
的顺序和分配给 box
的顺序与它应该的相反。你写的方式:
box = asyncio.run_coroutine_threadsafe(inference(5), new_loop)
print(box.result())
...第一次完成推理时,您安排新的推理并等待它完成。在下一次循环迭代中,您将打印一个“跟踪”,然后 box.done()
将立即为真,因为您已经等待它完成。
要修复它,请颠倒顺序:
print(box.result())
box = asyncio.run_coroutine_threadsafe(inference(5), new_loop)
或改写如下:
new_box = asyncio.run_coroutine_threadsafe(inference(5), new_loop)
print(box.result())
box = new_box
我正在为水下航行器编写推理系统,有人告诉我研究异步以改进对象跟踪。这个想法是有一个 tflite 对象检测模型来检测对象和 returns 一个 box/coordinates 它检测到的每个对象,然后 meanshift (或一些其他跟踪算法然后用来跟踪对象)。然而,tflite 模型需要大约 1 秒的时间来进行检测,这太慢了。所以我想 运行 在一个单独的线程中,当 meanshift 正在跟踪时,只要 tflite 模型完成,它就会更新要跟踪的框。那样的话,我假设我们会进行顺利的检测和跟踪。
我发现异步有点棘手,不太正确。出于测试目的,我创建了一个具有 5 秒延迟的推理函数,以清楚地模拟推理所需的时间,并创建了一个连续运行的跟踪函数来模拟 meanshift。这是我目前所拥有的:
async def inference(x):
await asyncio.sleep(x)
return "===========Inference Done================= "
def tracking():
print("tracking...")
def start_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()
# start the object detection model before
box = asyncio.run_coroutine_threadsafe(inference(5), new_loop)
while True:
if box: # if the object detection has detected an object and return a bounding box, track it
tracking()
if box.done(): # if the tflite has completed its detection, start the next detection
box = asyncio.run_coroutine_threadsafe(inference(5), new_loop)
print(box.result())
此处的预期输出是 tracking...
连续打印,===========Inference Done=================
每 5 秒打印一次。然而,发生的是 tracking...
连续运行 5 秒,然后它开始这样做:
tracking...
tracking...
tracking...
tracking...
tracking...
tracking...
tracking...
tracking...
===========Inference Done=================
tracking...
===========Inference Done=================
tracking...
我该如何解决这个问题?
你的奇怪输出是因为 print
的顺序和分配给 box
的顺序与它应该的相反。你写的方式:
box = asyncio.run_coroutine_threadsafe(inference(5), new_loop)
print(box.result())
...第一次完成推理时,您安排新的推理并等待它完成。在下一次循环迭代中,您将打印一个“跟踪”,然后 box.done()
将立即为真,因为您已经等待它完成。
要修复它,请颠倒顺序:
print(box.result())
box = asyncio.run_coroutine_threadsafe(inference(5), new_loop)
或改写如下:
new_box = asyncio.run_coroutine_threadsafe(inference(5), new_loop)
print(box.result())
box = new_box