Python 异步网络请求,图像识别 - V2EX
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kayseen

Python 异步网络请求,图像识别

  •  
  •   kayseen Dec 3, 2020 2740 views
    This topic created in 1986 days ago, the information mentioned may be changed or developed.

    比如识别图片有三个步骤,分为三个网络请求

    第一个请求接口是上传图片,返回 uuid

    第二个请求接口是根据 uuid 获取图像识别的结果

    第三个请求接口根据 uuid 删除服务端的图片

    此时如果本地有 10000 张需要批量识别的图片,应该如何提高整个过程的效率呢?

    使用 aiohttp 写三个请求方法依次完成三个请求接口算可行的方案吗?

    8 replies    2020-12-05 18:52:53 +08:00
    daiqiangbudainiu
        1
    daiqiangbudainiu  
       Dec 3, 2020
    比较简单的:协程或者多线程读取图片,然后同步去依次请求三个接口

    稍微麻烦一点:利用队列,生产者将图片往一个队列里边丢,消费者消费队列,然后请求传图片的接口,拿到 uuid 之后丢到另一个队列里边,然后这个队列的消费者消费,根据 uuid 获取图片结果,然后丢到另一个队列里边,然后消费者消费,去删除图片
    est
        2
    est  
       Dec 3, 2020
    要效率就一个接口搞定所有事情

    要 KPI 就建 1000 个接口
    Zhuzhuchenyan
        3
    Zhuzhuchenyan  
       Dec 3, 2020
    个人感觉有两种方案,
    第一种是
    async.gather(所有上传图片请求)
    async.gather(所有图像识别请求)
    async.gather(所有图像删除请求)
    适合图片上传时间差别不大,服务端能存下这么多图片,以及图片识别时间差别不大的情况

    第二种是定义一个函数
    async job(image):
    await 上传图片
    await 图像识别
    await 图像删除

    然后 async.gather(所有的 job)
    我的话应该会选择第二种吧,总体的执行时间理论上是一样的
    Zhuzhuchenyan
        4
    Zhuzhuchenyan  
       Dec 3, 2020
    哦补充下,如果根据 UUID 获取识别结果有可能是等待中( PENDING )的话,那只能走第二种方案添加一个定时轮询了。
    jdhao
        5
    jdhao  
       Dec 3, 2020
    每张图片这三个请求是有先后顺序吧,1 -> 2 -> 3,10000 张图片是相互独立的,可以搞个多线程,每个线程处理一张图片。
    xiaoqiao24
        6
    xiaoqiao24  
       Dec 3, 2020
    我觉得用队列比较好,第一个接口可以多线程(协程)一次处理 100 张图片,处理完的丢到 A 队列中
    第二个接口多线程(协程)读取 A 队列的 uuid,图像识别的结果丢到 B 队列
    第三个接口多线程(协程)读取 B 队列的结果,然后删除服务端的图片
    这样就同步进行,10000 张图片很快就能搞定
    hq
        7/span>
    hq  
       Dec 4, 2020
    我出个 Serverless 方案:
    1. 创建一个对象存储 bucket,比如 OSS
    2. 写一个图像识别函数,创建 trigger,关联 1 中的 bucket
    3. 调用 OSS 上传图片,上传时设置 TTL 为 1 小时,过期图片自动删除
    4. 下载识别结果到本地

    可以看看这个示例: https://help.aliyun.com/document_detail/74761.html
    black11black
        8
    black11black  
       Dec 5, 2020 via Android
    一定要分步骤就不可避免的有状态了吧,要不然接数据库把状态转移出去,要不然合并消除状态本身,有状态没法部署啊
    About     Help     Advertise     Blog     API     FAQ     Solana     2898 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 15:25 PVG 23:25 LAX 08:25 JFK 11:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86