我讨厌“Javascript 无所不能”的趋势.. 是的.. Javascript 在这一点上几乎可以做任何事情.. BUTT,这样做有效吗?
让我们举一个非常密集的 CPU 密集型任务的示例。这是模拟 CPU 密集型任务的代码示例。让我们看看 Javascript 是如何执行的。
setTimeout(function() { console.log("Hello world") }, 1000) const startTime = Date.now(); while (Date.now() - startTime < 3000) {} //Simulating a long CPU intensive main thread task.. console.log("End")
那么,我们这里有什么?我,作为 JAVASCRIPT 的用户,希望在 1 秒后看到“hello world”打印出来......你猜怎么着。事实并非如此。 3秒后它会吐出“hello world”..
为什么会发生这种情况?为了理解这一点,我们需要了解浏览器和 Node js 中的事件循环是如何工作的。简单来说,事件循环同时检查调用堆栈和回调队列。一旦计时器完成 1000ms,我们传入 setTimeout() 的回调函数就会进入回调队列。
但是你猜怎么着...当计时器完成工作时,调用堆栈不为空..它仍然忙于执行我们编写的 3 秒 CPU 密集型任务(是的..它是一个模拟..不是一个现实世界中的愚蠢程序,需要 3 秒才能完成其打算做的任何事情)。
所以,回调队列和微任务队列中的回调函数将会挨饿。. 糟糕的回调函数。他们只有在 3 秒后才有机会进入调用堆栈。这就是为什么我们看到“hello world”在 3 秒后被打印出来,即使我指定了 1000 毫秒。
是的。这是我从网上下载的事件循环的随机图像。很酷的图像。
让我们使用一个执行相同操作的 Go 代码..
package main import ( "fmt" "time" ) func main() { time.AfterFunc(1*time.Second, func() { fmt.Println("Hello world") }) // Simulating a long CPU-intensive main thread task startTime := time.Now() for time.Since(startTime) < 3*time.Second { } print("End") }
这里,“hello world”在 1 秒后被打印出来..如何?因为 AfterFunc() 运行在它自己的 GoRoutine 上,它与主 GoRoutine 没有任何关系..
我们来谈谈reactJS。它将 javascript 组件推送到客户端,并用很多东西塞住客户端的喉咙,以至于客户端开始节流..
想象一下,一台低端 PC 请求一些静态 HTML 文件,然后你会得到一堆 React 组件的垃圾。客户端会有什么感觉?它变得很慢..浏览器必须解析 javascript,执行虚拟 DOM,从中生成 HTML..还有什么..
浏览器正在完成服务器必须做的所有工作..
还记得网络的自然流动吗?
先加载 HTML,然后才加载 javascript?为什么?为了使初始绘制尽可能快..还记得我们在 HTML 文档页脚中加载 javascript 的日子吗?
React 只是让整个流程颠倒了。
结果,客户必须长时间盯着空白屏幕..
最让我印象深刻的是,Go 是一种编译语言,而且是静态类型的.. 你可以盲目地说,Go 超级快,比 javascript 快很多..
它有内置的轻量级线程,称为“GoRoutines”,它比实际操作系统线程快得多,因为 Go 线程是轻量级的。
Go 可用于构建 RESTful 端点或可用于任何后端服务..
但是,我不能使用 Go 进行 SSR。PHP 的亮点就在于此。在我的堆栈中,Go 将大量用于 CPU 密集型 API 或任何后端服务。
PHP 是我用过的最好的 SSR 工具。简单且非常直接。为每个客户端创建一个进程..使得速度有点慢。但这些进程仍然是彼此独立的,不像线程共享相同的进程内存空间,并且不利于竞争条件和许多其他线程相关的问题..
在我看来,PHP 也与 Web 紧密耦合。直接开箱即用的超级全局变量,如 $_GET、$_SERVER 等...这使得一般情况下使用 Web 变得更容易。
PHP 中的会话管理太好了.. 语言本身自带.. 并且管理会话太容易了..
PHP 可以纯粹用于 SSR。和会话管理。我不能相信 PHP 可以完成 CPU 密集型任务,因为它很糟糕。为什么?它是一种解释性语言,而且也不是多线程的..
因此,我将所有 CPU 密集型调用卸载给 Go。
两个世界中最好的.. PHP 用于 SSR,这样客户端就不会受苦,并且可以执行 CPU 密集型任务,因为它可以很好地实现并发...
以上是PHP 和 Go 作为技术堆栈。的详细内容。更多信息请关注PHP中文网其他相关文章!