- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在 nodejs 中,主要批评者基于其单线程事件循环模型。
nodejs 最大的缺点是无法在应用程序中执行 CPU 密集型任务。为了演示目的,让我们以 while 循环为例(这可能类似于一个返回十万条记录的 db 函数,然后在 nodejs 中处理这些记录。)
while(1){
x++
}
此类代码将阻塞主堆栈,因此事件队列中等待的所有其他任务将永远没有机会执行。 (而在 web 应用程序中,新用户将无法连接到该应用程序)。
但是,可以使用像cluster
这样的模块来利用多核系统并部分解决上述问题。 Cluster 模块允许创建一个由独立进程组成的小型网络,这些进程可以共享服务器端口,这使 Node.js 应用程序可以访问服务器的全部功能。 (但是,使用 Cluster 的最大缺点之一是无法在应用程序代码中维护状态)。但是,如果服务器负载过大,我们很有可能再次陷入同样的情况(如上所述)。
当我开始学习 Go 语言并了解它的架构和 goroutine 时,我认为它可能会解决由于 nodejs 的单线程事件循环模型而出现的问题。并且它可能会避免上述 CPU 密集型任务的场景,直到我遇到这段有趣的代码,它阻塞了所有 GO 应用程序并且什么也没有发生,很像 nodejs 中的 while 循环。
func main() {
var x int
threads := runtime.GOMAXPROCS(0)
for i := 0; i < threads; i++ {
go func() {
for { x++ }
}()
}
time.Sleep(time.Second)
fmt.Println("x =", x)
}
//or perhaps even if we use some number that is just greater than the threads.
所以,问题是,如果我有一个负载密集型应用程序,并且还会有很多 CPU 密集型任务,我可能会陷入上述情况。 (其中 db 返回大量行,然后应用程序需要处理和修改这些行中的某些内容)。传入的用户不会被阻止,所有其他任务也会被阻止吗?
那么,如何解决上述问题呢?
附言
或许,我提到的用例没有多大意义? :)
最佳答案
目前(Go 1.11 及更早版本)你所谓的紧密循环确实会阻塞代码。发生这种情况仅仅是因为当前 Go 编译器插入执行“抢占检查”的代码(«我应该放弃吗?到调度程序,以便它运行另一个 goroutine?») 仅在它编译的函数的序言(几乎,但我们不要离题)。如果您的循环不调用任何函数,则不会进行抢占检查将被制作。
Go 开发者很清楚这一点和 are working on eventually alleviating this issue .
仍然请注意,您所谓的问题在最真实的场景:执行很长时间的代码在不调用任何函数的情况下运行 CPU 密集型工作很少见,而且介于两者之间。
在某些情况下,您确实拥有这样的代码并且您拥有检测到它真的让其他 goroutines 饿死(让我强调一下:你已经通过分析发现了这一点——作为反对只是想出“它一定很慢”),你可以应用几种技术来处理这个问题:
runtime.Gosched()
的调用在某些关键点长时间运行的 CPU 密集型代码。这将强制放弃对另一个 goroutine 的控制而实际上并没有挂起调用者 goroutine(所以它会一旦再次安排就运行)。N
个“worker goroutines”;N
明显小于 runtime.GOMAXPROCS
或提高后者,这样您就有了 N
个额外的线程。关于node.js - Nodejs EventLoop(带集群模块)和Golang Scheduler的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51375902/
EventLoop 接口 Netty 是基于 Java NIO 的,因此 Channel 也有其生命周期,处理一个连接在其生命周期内发生的事件是所有网络框架的基本功能。通常来说,我们使用一个线程来处理
与通过 POLLIN 多路复用多个套接字有何不同? while True: socks = dict(poller.poll()) if socks.get(control_recei
相关问题here 我发现了 runTouchApp 函数的 slave 属性可以阻止 Kivy 的事件循环运行并强制从其他地方更新它。 这是使用该属性的 app.py 的一部分: # we are i
我正在阅读netty 4源代码。 eventLoop.inEventLoop() 随处可见。根据 Netty 的实际情况: A Channel is registered for its lifeti
如何从 EventLoop 获取单线程执行器? 原因是我想对应用程序的一部分使用单个线程,但仍可供 EventLoop 使用。 最佳答案 事件循环始终仅由单个线程支持。所以事件循环实际上只是一个单线程
我的应用程序的第一个屏幕有一个包含三个按钮的小菜单(在网格布局中)。两个应该打开弹出窗口。一份用于“帮助”,一份用于“关于”。第三个屏幕变为另一个屏幕。 只有一个弹出窗口有效。第一个调用(在 kivy
我想在后台线程中创建一个 PyZMQ 事件循环,并让它与独立的 Python 脚本和 IPython 脚本一起正常工作。 (IPython 使用位于主线程中的 PyZMQ 事件循环,因此这给我带来了问
我真的为此而疯狂,我希望有人能给出答案......我确实遇到了 QUdpSockets 的奇怪问题以及信号和槽连接。我在 3 个不同的 UdpSockets 接收小数据包(64 字节) 100Hz,之
我正在尝试让 python 为我播放一个音频文件。我正在思考的树冠中编写我的代码。 import pyglet sound = pyglet.media.load('song.wav') sound.
我正在尝试构建一个基于Netty的UDP服务器,以根据客户端订阅(在订阅设置之前交换一些UDP请求/响应消息)向不同的客户端持续发布事件(每秒大约500个事件)。 设计是让 Java Executor
我试图理解为什么在我的 QProcess waitForFinished() 和 waitForStarted() 调用可以工作之前,不需要在以下 Qt 4.8 代码中调用 a.exec() 。我知道
我是一名 Rust 初学者,正在为异步 IO 问题而苦苦挣扎。我决定使用 mio . 我已经阅读了一些源代码和教程,但仍有一些基本部分我不明白。我正在使用 netcat -k -l 127.0.0.1
我想检测 Netty 的 EventLoop 以便: 以确定的顺序运行任务。 捕获计划任务的截止日期。 快进虚拟时钟,触发截止任务的执行。 我知道 EmbeddedChannel 并在一些测试中使用它
在设计和性能方面推荐哪种方法来处理多个 Zeromq 套接字,为什么? ZeroMQ 使用的 Tornado 的 IOLoop 占用的 CPU 比 while 循环中用于处理多个套接字的 Poller
Event Loop 是 JavaScript 的基础概念,面试必问,平时也经常谈到,但是有没有想过为什么会有 Event Loop,它为什么会这样设计的呢? 今天我们就来探索下原因。 浏览
1.写在前面 无论是浏览器端还是服务端Node.js,都在使用EventLoop事件循环机制,都是基于Javascript语言的单线程和非阻塞IO的特点。在EventLoop事件队列中有
什么功能eventloop在 Scala 中做 Actors它有什么用? 最佳答案 eventloop与 loop 类似和 react被结合。 loop的区别和 eventloop是loop ,实际上
我知道在 python37 中我们有一个新的 api asyncio.get_running_loop() ,好用,让我们在调用协程的时候不需要显式传递eventloop。 我想知道我们是否可以使用任
我越来越熟悉 python 的 异步 ,python中的异步编程,协程等。 我希望能够用我自己定制的 执行几个协同程序事件循环 . 我很好奇我是否可以自己写 事件循环 不导入 异步 根本 最佳答案 I
我正在研究Netty 4.0.0.Alpha5代码,以了解如何处理线程。我还通过http://netty.io/wiki/new-and-noteworthy-in-4.0.html#wiki-h2-
我是一名优秀的程序员,十分优秀!