V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TomeWong
V2EX  ›  程序员

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

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

    最近尝试很多方法,来解决 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 并发上传,不是所有的文件一起上传,是有队列控制的
    xcstream
        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   ·   实用小工具   ·   1289 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 18:01 · PVG 02:01 · LAX 10:01 · JFK 13:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.