【问题标题】:Should I use asyncio or thread pool for gain performance in api requests? [closed]我应该使用 asyncio 还是线程池来获得 api 请求的性能? [关闭]
【发布时间】:2019-08-31 10:16:58
【问题描述】:

我想用 azure 认知服务的人脸 API 制作一个实时人脸识别器。但是api调用需要很多时间。在这种情况下我应该使用什么概念?

我在简单的 while 循环中编写了我的代码。抓住一个框架并检测该框架中的人脸。但是检测人脸的请求部分大约需要 2.5 秒。所以,它与实时检测相去甚远 :) 我在他们的网站上找到了一个 c# 示例,但我无法处理。链接是:https://docs.microsoft.com/en-us/azure/cognitive-services/face/face-api-how-to-topics/howtoanalyzevideo_face

while True:
    image = getCapture()
    cv2.imshow('image', image)
    image = cv2.imencode('.jpg', image)[1].tostring()
    response = requests.post(vision_analyze_url,
                             params=params,
                             headers=headers,
                             data=image)
    print(response.json())
    key = cv2.waitKey(1) & 0xFF

我想实时制作,但我认为这是不可能的:/ 所以我可以保存视频并使用批量图像提出请求,或者我可以同时完成这两项工作。我能做些什么?我必须在 2 天内完成 :D

【问题讨论】:

    标签: python multithreading opencv request python-asyncio


    【解决方案1】:

    但是检测人脸的请求部分大约需要 2.5 秒。 [...] 我想让它成为实时的

    您可以并行提交请求以提高处理吞吐量。要从当前的 0.4 fps 升级到 25 fps(实时),您必须并行提交约 625 个请求。您仍然会有 2.5 秒的延迟,但延迟是恒定的。除非您的后端有 600 多个内核,或者它在集群上运行,否则这不太可能奏效。但是如果你想试试,并行运行请求的代码可能是这样的:

    import concurrent.futures, itertools, functools
    
    pool = concurrent.futures.ThreadPoolExecutor(max_workers=1000)
    
    def on_complete(frameno, future):
        response = future.result()
        print(frameno, response.json())
    
    for frameno in itertools.count(start=1):
        image = getCapture()
        cv2.imshow('image', image)
        image = cv2.imencode('.jpg', image)[1].tostring()
        future = pool.submit(lambda: requests.post(vision_analyze_url,
            params=params, headers=headers, data=image))
        future.add_done_callback(functools.partial(on_complete, frameno))
        key = cv2.waitKey(1) & 0xFF
    

    这使用线程; asyncio 不适合解决这个问题,因为您使用的是非异步 cv2 库,它会阻塞事件循环。

    【讨论】:

    • 我决定保存输入视频,而不是用它发出并行请求。这是我的代码,如果您能查看它,我将不胜感激。 :) paste.ubuntu.com/p/bcPT3Jp6th
    • @CanSözbir 这看起来与我的回答中的一般方法相同,只是您首先收集图片然后发送它们进行处理,而我的回答试图实时进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2015-06-23
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多