在 Go 中,编写非阻塞代码有意义吗?
从 Node.js 的角度来看,所有代码都是非阻塞的。
在 Go 中,使用通道可以轻松实现非阻塞。
如果有人在 go 中编写一个 Node.js 类型的服务器,使其成为非阻塞是否有意义?例如,让数据库 connect() 函数返回一个通道,而不是在等待连接发生时阻塞。
对我来说,这似乎是正确的方法
,但是......
coming from node.js point of view, where all code is non-blocking.
In Go, non-blocking is easily achieved using channels.
if one were writing a node.js type server in go, does it make sense to make it non-blocking? for example, having a database connect() function return a channel, as versus blocking while waiting for the connection to occur.
to me, this seems the correct approach
but ...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(5)
对于典型的 Web 服务器类型应用程序,我建议不要将所有内容都设为异步。有几个原因。
比异步代码更容易推理串行阻塞代码(更容易看到错误)
golang 错误处理基于defer()、panic() 和recover(),这可能无法为您提供 100% 异步代码想要的东西
如果你不小心,Goroutines 可能会泄漏[一个讨论]。异步行为越多,追踪这些类型的问题就越困难,而且它们出现的可能性就越大。
一种策略是将异步性集中在较高的级别上,而让其他一切都阻塞。因此,您可能有一个“数据库处理程序”blob,在逻辑上与“请求处理程序”blob 不同。它们都在单独的 goroutine 中运行并使用通道进行通信。但在“数据库处理程序”中,建立数据库连接和执行每个查询的调用是阻塞的。
您不必选择 100% 异步或 0% 异步。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
阻塞和非阻塞实际上与性能无关,它们与接口有关。
如果您有一个执行线程,那么阻塞调用会阻止您的程序在等待时执行任何有用的工作。
但是,如果您有多个执行线程,则阻塞调用并不重要,因为您可以让该线程阻塞并在另一个线程中执行有用的工作。
在 Go 中,当一个 Goroutine 在 I/O 上阻塞时,它就会被替换为另一个 Goroutine。 Go 运行时使用非阻塞 I/O 系统调用来避免操作系统阻塞线程,以便在第一个 goroutine 等待 I/O 时可以在其上运行不同的 goroutine。
Goroutine 非常便宜,因此不需要编写非阻塞风格的代码。
Blocking and non-blocking aren't really about performance, they are about an interface.
If you have a single thread of execution then a blocking call prevents your program from doing any useful work while it's waiting.
But if you have multiple threads of execution a blocking call doesn't really matter because you can just leave that thread blocked and do useful work in another.
In Go, a goroutine is swapped out for another one when it blocks on I/O. The Go runtime uses non-blocking I/O syscalls to avoid the operating system blocking the thread so a different goroutine can be run on it while the first is waiting for it's I/O.
Goroutines are really cheap so writing non-blocking style code is not needed.