如何在 Python 存在多个事件循环时正常使用 mayavi 绘图? - V2EX
V2EX = way to explore
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
thinkershare

如何在 Python 存在多个事件循环时正常使用 mayavi 绘图?

  •  
  •   thinkershare
    thinkershare 2022 年 6 月 21 日 1992 次点击
    这是一个创建于 1403 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用 Python 创建了一个 WebSocket 连接, 然后开始监听网络响应, 在接受到网络响应的事件回调中, 将数据使用 Mayavi 绘制到屏幕上, 但我发现一旦启动了 WebSocket 后, Mayavi 就无法绘图. 我猜想是因为这 2 个都要求主线程的事件循环, 现在不知道怎么处理了. fork 整个进程和开一个新进程不在考虑范围, 因为启动新进程代价太多, 用户不能接受如此高的延迟!

    neoblackcap
        1
    neoblackcap  
       2022 年 6 月 21 日
    试试多线程 + ioloop
    LeeReamond
        2
    LeeReamond  
       2022 年 6 月 21 日   1
    使用进程是很合理的考虑,不想新开的话可以用可复用的设计,不知道为什么不考虑。本身如果你使用线程解决了的话,GIL 不能释放又成了一个问题,会拖慢渲染效率的
    thinkershare
        3
    thinkershare  
    OP
       2022 年 6 月 21 日
    @LeeReamond 没找到好的办法, 只能使用多进程, 然后使用 Queue 做数据通讯, 但真的很慢很慢. 你用过 mayavi 库吗? 是否有性能优化建议, 这个库启动非常耗时, 每次至少需要 3-10s, 每次同步的数据数据比较大 1-10MB, 然后还需要从 str->bytes->目标数据结构, 最终体验非常差.
    LeeReamond
        4
    LeeReamond  
       2022 年 6 月 21 日
    @thinkershare 不好意思不是很熟悉,只是从常理的角度考虑,即使用子进程,载入不也是启动时载入一次就完事了。所以你的开销应该只有实时通讯传入的数据。而 10M 的数据无论对 socket 收发还是 python 计算来说都不大,处理时间应该在毫秒这个数量级才对
    thinkershare
        5
    thinkershare  
    OP
       2022 年 6 月 21 日
    @LeeReamond 2MB 的 base65(本来是 bytes, 但因为某些原因, 我需要将其编码为 base64), 然后还原到 bytes-> 然后转换未 numpy, 然后转换未 tensor, 然后使用 mayavi 显示(10W-20W 个 point cloud), 最终就是非常慢. 反序列化这一部分就已经需要秒级了. 最终完成一次窗口绘制, 时间就超过 5s 了. 主要还是二进制序列化太消耗时间了. 不做二进制序列化又太大, 一次网络纯属 20MB, 都需要 10s(香港到大陆). 我想想该怎么优化.
    thinkershare
        6
    thinkershare  
    OP
       2022 年 6 月 21 日
    2MB 的 base64 str(本来是 bytes, 但因为某些原因, 我需要将其编码为 base64), 然后还原到 bytes-> 然后转换为 numpy, 然后转换为 tensor, 然后使用 mayavi 显示(10W-20W 个 point cloud), 最终就是非常慢. 反序列化这一部分就已经需要秒级了. 最终完成一次窗口绘制, 时间就超过 5s 了. 主要还是二进制序列化太消耗时间了. 不做二进制序列化又太大, 一次网络传输 20MB, 大概需要 10s(香港到大陆). 我想想该怎么优化.
    LeeReamond
        7
    LeeReamond  
       2022 年 6 月 22 日
    @thinkershare



    你的实现可能有些问题,我测了一下两百万的 f64 矩阵,外套一层 zip 压缩,重新转为 numpy 对象的耗时是 70ms ,如果只是 2M 的流的话我这里执行时间是 8ms 。numpy 的序列化和反序列化效率印象里一直不太行,8ms 并不快,不过感觉不应成为你的瓶颈。传输方面的话,阿里腾讯在香港的机器连内地可以跑百兆的,2M 应该很快。正态分布 f64 压缩后也能压 70%左右的体积,如果你能接受削减一些精度应该能压更多
    thinkershare
        8
    thinkershare  
    OP
       2022 年 6 月 22 日
    @LeeReamond 我晚上回去打 log 看下各个地方的耗时, 我现在都没有跨网络, 本机测试延迟都是 1400ms, server, provider, render 都在本机.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4842 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 57ms UTC 09:40 PVG 17:40 LAX 02:40 JFK 05:40
    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