在网上查了一下,说是如果多个线程同时修改 DOM ,可能会导致竞态条件和不可预测的结果。但是微信小程序用的就是双线程啊?所以浏览器用单线程最本质的原因是什么?以及微信小程序为什么要使用双线程?
1
Danswerme 5 小时 56 分钟前 via iPhone
微信小程序的双线程是指渲染层和逻辑层由不同的线程管理。
https://developers.weixin.qq.com/community/develop/article/doc/0000461093c4d8782ff7cf7d95b413 |
2
UnluckyNinja 5 小时 53 分钟前 via Android
渲染层两者不都是单线程吗,想另开逻辑线程浏览器也可以用 worker ,worker 不能直接操作 dom
|
![]() |
3
IvanLi127 5 小时 44 分钟前
GUI 渲染一般都是单线程的,小程序也是。
chrome 浏览器的 js 执行是在独立线程的,小程序也是。 小程序和 chrome 一样,js 执行完需要改界面也是委托给渲染线程渲染。至少在这层面来说他们没有你说的区别。 |
![]() |
4
heroisuseless OP @IvanLi127 我比较好奇为什么浏览器会设计成这样,微信小程序又设计成那样,以及浏览器为什么不设计成微信小程序这样的
|
![]() |
5
ShineyWang 5 小时 22 分钟前 via Android
GUI 有单独的页面更新和渲染逻辑
windows 上我就遇到过另一个线程修改页面导致控件花屏的 |
![]() |
6
IvanLi127 5 小时 17 分钟前
@heroisuseless 我搜了下网上关于小程序双线程的文章,感觉是说的浏览器和 chrome 之类的现代浏览器是不同的。浏览器那么多,你说的是哪个?
|
7
coolcoffee 5 小时 15 分钟前
微信小程序的方式只是同一个页面中渲染和逻辑是分离的,UI 层面本质上还是 webview 在绘制,这个 Android 手机上打开调试模式就可以看到页面栈或者 tab 页面都是一个独立的 webview 。
我所了解的除了浏览器渲染,其他像 iOS 原生、Android 原生、Unity 游戏开发都是只能在 UI 线程也称主线程上操作。 最阻碍技术推进的原因肯定是复杂度和收益不成正比。比如本来只通过主线程操作可以进行脏检查来加快一帧数据渲染,但是多线程下面就歇菜了。 |
![]() |
8
tcper 4 小时 47 分钟前
小程序的双线程,本质上就是阉割了 webview ,通过他们的框架/IDE/runtime 将逻辑放在他们定制的逻辑线程里执行,然后通过 setData 通知 webview 更新,这么做他们的理由就是内容可控、安全什么的,当然有一定的道理。
所以说小程序所谓的双线程是没有太多技术创新的,因为只是嫁接在 webview 上实现的功能,而且他们的目的也不是技术创新,只是为了实现自身可控的 runtime 。 |
![]() |
9
powersee 4 小时 26 分钟前
几乎所有 GUI 渲染都是单线程的,多线程渲染很容易出现死锁、竞争等问题。
|
![]() |
10
araraloren 4 小时 12 分钟前
多线程带来的问题大于能带来的好处,除非有更好的架构真的能让你的程序有特定的优点。
|
![]() |
11
shadowyue 3 小时 54 分钟前 ![]() 你别想复杂了,现实生活中画画这个行为就无法多人合作。
你见过有十个画师同时画一张色图吗? A 画师绘制巨乳的时候,别人就只能去画美腿。 能优化的只有分图层,分模块,这一部分 GPU 级别就已经做了很多优化了。 现实世界做不到的事情,程序上也做不到。代码也是现实世界的映射。 |
12
kaedeair 3 小时 34 分钟前
所有的 gui 程序中更新界面的工作都只能交给一个线程
|
13
leonshaw 3 小时 33 分钟前 via Android
因为一个线程够了
|
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 |
15
4kingRAS 2 小时 56 分钟前
微信小程序那个问题是为了实现热更新使用了 web 技术,而 webview UI 和 js 都在一个线程,JS 里执行一些耗时逻辑,UI 不就直接卡死了,所以分了双线程 UI 和 逻辑
|
![]() |
16
GeekGao 2 小时 52 分钟前
|