web worker 解决 Electron 渲染进程大量计算问题? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
TomeWong
V2EX    程序员

web worker 解决 Electron 渲染进程大量计算问题?

  •  
  •   TomeWong 2020-04-21 16:26:19 +08:00 4695 次点击
    这是一个创建于 2013 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近尝试很多方法,来解决 electron 渲染进程上传大量文件的问题,也调研了一些。如下:

    1 、手写 addon,使用 node-gyp 编译,奈何 c++不会啊,放弃

    2 、将上传大量文件的处理逻辑移至主进程,但主进程进行大量的计算也需要阻塞,主进程阻塞会导致渲染进程交互 卡顿,甚至系统崩溃,也只好放弃。

    3 、采用 web woker 来处理,electron 对应 web worker 没有集成远程的 node.js api,读取本地文件会有问题,这个需要如何处理,还在思考中。。。

    4 、新建一个 hiden renderer 来处理,实际上就是新建一个隐藏的 Broswerwindow,这个可以如理读取本地文件,但设计到通信问题,也在搜索中?

    各位大佬,如有思路,还请指点迷津,谢谢!!!

    第 1 条附言    2020-04-22 15:02:02 +08:00
    刚刚代码测试,发现 web woker 暂时不支持 fs 模块,这个问题就很尴尬了,想了很多中方法,最后发现这个最好实施的却没法实现。。。
    第 2 条附言    2020-04-22 15:05:41 +08:00

    if you’re using a hidden renderer you can use the NodeJS fs module to access local files. This doesn’t work with web workers as they don’t support NodeJS integration.

    这个是在medium上看到的一个大佬的回复 参考

    18 条回复    2020-11-23 14:52:34 +08:00
    Virace
        1
    Virace  
       2020-04-21 16:42:12 +08:00 via Android
    难道是要所有文件一上传?
    Virace
        2
    Virace  
       2020-04-21 16:42:25 +08:00 via Android
    @Virace 一起
    Jirajine
        3
    Jirajine  
       2020-04-21 16:48:39 +08:00 via Android
    用 go 单独写一个服务跟随主进程一起启动,通过 IPC 交互,逻辑都用 go 实现。
    TomeWong
        4
    TomeWong  
    OP
       2020-04-21 16:53:52 +08:00
    @Jirajine 不会用 go
    TomeWong
        5
    TomeWong  
    OP
       2020-04-21 17:33:30 +08:00
    @Virace 并发上传,不是所有的文件一起上传,是有队列控制的
    xctream
        6
    xcstream  
       2020-04-21 18:06:08 +08:00
    Electron 有 node 进程
    whypool
        7
    whypool  
       2020-04-21 18:13:51 +08:00
    首先,上传走的异步,除非 dom 爆了,也不至于卡 ui
    其次,看你描述应该是 js 内存爆了导致
    如果上传文件没啥限制直接用 formdata
    文件读写 node 有 stream,同步卡线程可以用异步流
    tojonozomi
        8
    tojonozomi  
       2020-04-21 19:03:09 +08:00
    可以考虑 wasm,可以用很多语言,性能应该有原生的一半
    charten
        9
    charten  
       2020-04-21 19:55:00 +08:00   1
    上传大量文件?是大文件还是大量文件?渲染进程 node 可以读流写流啊,这是 web 环境不具备的。基本上每个进程限制死 1g 内存的读写操作没啥问题的。electron 多进程,开多个窗口就是多进程了,可以嵌几个 iframe 进去
    maichael
        10
    maichael  
       2020-04-21 20:03:13 +08:00
    node 开个子进程去跑不就好了吗。
    TomeWong
        11
    TomeWong  
    OP
       2020-04-22 14:57:21 +08:00
    @charten 上传大量的文件,这些文件既包含小文件,也可能包含大文件,多进程还没有深入的看,我可以看下,谢谢
    TomeWong
        12
    TomeWong  
    OP
       2020-04-22 14:58:48 +08:00
    @maichael 频繁通信也会有问题啊
    TomeWong
        13
    TomeWong  
    OP
       2020-04-22 14:59:19 08:00
    @whypool 是用的异步流
    TomeWong
        14
    TomeWong  
    OP
       2020-04-22 14:59:41 +08:00
    @tojonozomi 暂时没有技术积累啊
    axeprpr1
        15
    axeprpr1  
       2020-04-22 23:33:20 +08:00
    electron 可以用 node.js =>
    let win = new BrowserWindow({
    webPreferences: {
    nodeIntegrationInWorker: true
    }
    })
    或者用 webview 来处理,也不会卡 ui
    TomeWong
        16
    TomeWong  
    OP
       2020-04-23 14:19:33 +08:00
    @axeprpr1 设置了
    agoodob
        17
    agoodob  
       2020-09-26 22:49:10 +08:00
    请问最后怎么解决的呢?
    TomeWong
        18
    TomeWong  
    OP
       2020-11-23 14:52:34 +08:00
    @agoodob 数据存储用的是 levelDB,页面渲染使用的是 vue-virtual-scroller
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2670 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 08:38 PVG 16:38 LAX 01:38 < href="/worldclock#jfk">JFK 04:38
    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