JavaScript 如果拥有多线程能力会怎样
答案:2 悬赏:60 手机版
解决时间 2021-02-19 12:29
- 提问者网友:暮烟疏雨之际
- 2021-02-18 18:33
JavaScript 如果拥有多线程能力会怎样
最佳答案
- 五星知识达人网友:酒醒三更
- 2021-02-18 20:08
javascript没有多线程,所以也不存在多线程同时运行的说法。平时写代码的时候需要考虑尽量避免线程阻塞。
比较好的方法就是尽量使用异步+回调的方式进行处理。
比较好的方法就是尽量使用异步+回调的方式进行处理。
全部回答
- 1楼网友:封刀令
- 2021-02-18 21:09
JS本身是为GUI而生的语言,GUI生而是多线程的,但生而也是单线程的。因为竞争访问的问题,只有一个UI线程是一种安全的方式。比如C# WinForm中只允许一个线程访问GUI,其他线程需要以委托的形式来访问GUI。
JS曾经在Web GUI中表现良好,因为过去的Web GUI规模小,只要注意一些写法问题,不太容易遇到阻塞UI线程的问题,直到应用程序变复杂了才开始注意到这些问题。浏览器变得更快一定程度上延缓了这些问题,但是终究还是对并发的需求越来越大。
WebWorker是真多线程——当然我是说从实现上讲,它是多个线程,至于楼主所说的,没有共享全局变量、没有锁,我觉得没有必要太纠结。多线程是一种并发模型,并且也许是受众最广泛的一种。WebWorker用的是基于通讯的并发模型,类似于erlang、Go,用的是Share Nothing的哲学(虽然终究还是有SharedArrayBuffer),它们都是经过了工业级别考验的。
有了share那么必然会有竞争访问,于是就有了锁,这些都是自然而然的。但是,很明显,JS的发展倾向于share nothing,不然就干脆把整个global对象share了算了。
至于为什么留SharedArrayBuffer,我觉得这只能说是“给不给”这个东西,不是“要不要”这样用了。这就和Go有点像了,应为闭包的存在GoRoutine之间也可以share,于是它也提供了锁,提供了mutex,但是它所建议的哲学还是用channel,用CSP,于是大家通常也都还是这么用。用GoRoutine当线程用,让channel滚蛋,还是用锁,还是可以做并发编程啊,但是好像没人这么弄吧,哈哈。
多线程只是手段,并发才是目的,只要能实现目的,手段就是个方法论而已。
至于多线程和异步之间我感觉没有太直接的绑定关系吧,单线程可以异步,多线程也可以同步。
如果JS一开始就具有多线程的话,现今JS程序员可能会少一半吧(笑
JS曾经在Web GUI中表现良好,因为过去的Web GUI规模小,只要注意一些写法问题,不太容易遇到阻塞UI线程的问题,直到应用程序变复杂了才开始注意到这些问题。浏览器变得更快一定程度上延缓了这些问题,但是终究还是对并发的需求越来越大。
WebWorker是真多线程——当然我是说从实现上讲,它是多个线程,至于楼主所说的,没有共享全局变量、没有锁,我觉得没有必要太纠结。多线程是一种并发模型,并且也许是受众最广泛的一种。WebWorker用的是基于通讯的并发模型,类似于erlang、Go,用的是Share Nothing的哲学(虽然终究还是有SharedArrayBuffer),它们都是经过了工业级别考验的。
有了share那么必然会有竞争访问,于是就有了锁,这些都是自然而然的。但是,很明显,JS的发展倾向于share nothing,不然就干脆把整个global对象share了算了。
至于为什么留SharedArrayBuffer,我觉得这只能说是“给不给”这个东西,不是“要不要”这样用了。这就和Go有点像了,应为闭包的存在GoRoutine之间也可以share,于是它也提供了锁,提供了mutex,但是它所建议的哲学还是用channel,用CSP,于是大家通常也都还是这么用。用GoRoutine当线程用,让channel滚蛋,还是用锁,还是可以做并发编程啊,但是好像没人这么弄吧,哈哈。
多线程只是手段,并发才是目的,只要能实现目的,手段就是个方法论而已。
至于多线程和异步之间我感觉没有太直接的绑定关系吧,单线程可以异步,多线程也可以同步。
如果JS一开始就具有多线程的话,现今JS程序员可能会少一半吧(笑
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯