在给定时间在同一屏幕截图中搜索大量图像时,我正在尝试调整此模块以支持异步执行。我对异步编码有点陌生,经过大量研究后,我选择了 Trio 来做这件事(因为它很棒而且很容易)。
重点是:
- 该函数接收图像路径列表
- 在每次迭代中,它都会截取屏幕截图并尝试在数组中查找图像(如果我们不为数组中的每次尝试都截取新的屏幕截图,这会更好地提高性能)
- 如果找到,则返回图像的路径和坐标
- 重新做一遍,因为屏幕上可能会出现一些图像
我将在另一个支持与 Trio 异步的项目中使用它,这就是我尝试转换它的原因。
这是我的尝试:
def image_search(image, precision=0.8, pil=None):
if pil is None:
pil = pyautogui.screenshot()
if is_retina:
pil.thumbnail((round(pil.size[0] * 0.5), round(pil.size[1] * 0.5)))
return most_probable_location(pil, image, precision)
async def multiple_image_search_loop(images, interval=0.1, timeout=None, precision=0.8):
async def do_search():
while True:
pil = pyautogui.screenshot()
for image in images:
if pos := image_search(image, precision, pil):
return {
"position": pos,
"image": image
}
await trio.sleep(interval)
if timeout:
with trio.fail_after(timeout):
return await do_search()
else:
return await do_search()
尽管代码看起来正确,但我觉得我错过了异步代码的要点。这一切都可以以同步的方式完成,我觉得我没有做任何改变。
如果性能没有差异,那还不错,因为关键是要使此功能在异步上下文中有用,而不会在搜索图像的整个过程中阻塞,但是如果我可以优化一些东西,那肯定会更好.
也许如果不是awaiting
在搜索所有图像之后我image_search()
通过调用trio.sleep()
并在主要功能上打开一个托儿所会更好?(trio.start_soon()
对数组中的每个图像使用其中的方法)。这会减少对我将要使用的其他项目的阻碍,但是查找图像需要更多时间,对吗?