V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heroisuseless
V2EX  ›  浏览器

为什么浏览器渲染进程不使用多线程的方式?

  •  
  •   heroisuseless · 6 小时 1 分钟前 · 1491 次点击

    在网上查了一下,说是如果多个线程同时修改 DOM ,可能会导致竞态条件和不可预测的结果。但是微信小程序用的就是双线程啊?所以浏览器用单线程最本质的原因是什么?以及微信小程序为什么要使用双线程?

    16 条回复    2025-02-23 12:43:09 +08:00
    Danswerme
        1
    Danswerme  
       5 小时 56 分钟前 via iPhone
    微信小程序的双线程是指渲染层和逻辑层由不同的线程管理。

    https://developers.weixin.qq.com/community/develop/article/doc/0000461093c4d8782ff7cf7d95b413
    UnluckyNinja
        2
    UnluckyNinja  
       5 小时 53 分钟前 via Android
    渲染层两者不都是单线程吗,想另开逻辑线程浏览器也可以用 worker ,worker 不能直接操作 dom
    IvanLi127
        3
    IvanLi127  
       5 小时 44 分钟前
    GUI 渲染一般都是单线程的,小程序也是。
    chrome 浏览器的 js 执行是在独立线程的,小程序也是。
    小程序和 chrome 一样,js 执行完需要改界面也是委托给渲染线程渲染。至少在这层面来说他们没有你说的区别。
    heroisuseless
        4
    heroisuseless  
    OP
       5 小时 38 分钟前
    @IvanLi127 我比较好奇为什么浏览器会设计成这样,微信小程序又设计成那样,以及浏览器为什么不设计成微信小程序这样的
    ShineyWang
        5
    ShineyWang  
       5 小时 22 分钟前 via Android
    GUI 有单独的页面更新和渲染逻辑
    windows 上我就遇到过另一个线程修改页面导致控件花屏的
    IvanLi127
        6
    IvanLi127  
       5 小时 17 分钟前
    @heroisuseless 我搜了下网上关于小程序双线程的文章,感觉是说的浏览器和 chrome 之类的现代浏览器是不同的。浏览器那么多,你说的是哪个?
    coolcoffee
        7
    coolcoffee  
       5 小时 15 分钟前
    微信小程序的方式只是同一个页面中渲染和逻辑是分离的,UI 层面本质上还是 webview 在绘制,这个 Android 手机上打开调试模式就可以看到页面栈或者 tab 页面都是一个独立的 webview 。

    我所了解的除了浏览器渲染,其他像 iOS 原生、Android 原生、Unity 游戏开发都是只能在 UI 线程也称主线程上操作。

    最阻碍技术推进的原因肯定是复杂度和收益不成正比。比如本来只通过主线程操作可以进行脏检查来加快一帧数据渲染,但是多线程下面就歇菜了。
    tcper
        8
    tcper  
       4 小时 47 分钟前
    小程序的双线程,本质上就是阉割了 webview ,通过他们的框架/IDE/runtime 将逻辑放在他们定制的逻辑线程里执行,然后通过 setData 通知 webview 更新,这么做他们的理由就是内容可控、安全什么的,当然有一定的道理。

    所以说小程序所谓的双线程是没有太多技术创新的,因为只是嫁接在 webview 上实现的功能,而且他们的目的也不是技术创新,只是为了实现自身可控的 runtime 。
    powersee
        9
    powersee  
       4 小时 26 分钟前
    几乎所有 GUI 渲染都是单线程的,多线程渲染很容易出现死锁、竞争等问题。
    araraloren
        10
    araraloren  
       4 小时 12 分钟前
    多线程带来的问题大于能带来的好处,除非有更好的架构真的能让你的程序有特定的优点。
    shadowyue
        11
    shadowyue  
       3 小时 54 分钟前   ❤️ 1
    你别想复杂了,现实生活中画画这个行为就无法多人合作。
    你见过有十个画师同时画一张色图吗?
    A 画师绘制巨乳的时候,别人就只能去画美腿。
    能优化的只有分图层,分模块,这一部分 GPU 级别就已经做了很多优化了。
    现实世界做不到的事情,程序上也做不到。代码也是现实世界的映射。
    kaedeair
        12
    kaedeair  
       3 小时 34 分钟前
    所有的 gui 程序中更新界面的工作都只能交给一个线程
    leonshaw
        13
    leonshaw  
       3 小时 33 分钟前 via Android
    因为一个线程够了
    4kingRAS
        14
    4kingRAS  
       3 小时 1 分钟前
    我刚学编程时深入研究过这个问题,不只是浏览器这么做,任何涉及 UI 的框架都是单线程模型,QT, Android ,Swing ,WPF ,MFC 等等等等。结论其实就很简单,也很笼统,就是多线程就是不好的设计,有时候为了加速不得已才引入的多线程。平时开发都是能不多线程就不多线程。

    几个链接自己研究去吧


    https://zhuanlan.zhihu.com/p/44639688


    https://flylib.com/books/en/2.558.1/why_are_guis_single_threaded_.html


    https://learn.microsoft.com/en-us/dotnet/desktop/wpf/advanced/threading-model?view=netframeworkdesktop-4.8
    4kingRAS
        15
    4kingRAS  
       2 小时 56 分钟前
    微信小程序那个问题是为了实现热更新使用了 web 技术,而 webview UI 和 js 都在一个线程,JS 里执行一些耗时逻辑,UI 不就直接卡死了,所以分了双线程 UI 和 逻辑
    GeekGao
        16
    GeekGao  
       2 小时 52 分钟前
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2729 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 07:35 · PVG 15:35 · LAX 23:35 · JFK 02:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.