Go 有 node.js 的“发射器”吗?
我正在通过移植我编写的 node.js 库来自学 Go。在 Node 版本中,一旦发生某些事情,库就会发出一个事件(例如,它在 UDP 端口 1234 上监听,当收到“ABC”时,发出“abcreceived”,以便调用代码可以根据需要做出响应(例如,发回“DEF”)
我在 Go 中看到过 channel (目前正在阅读它们),但由于我对这门语言还是陌生的,我不知道是否(或如何,就此而言)可以用来与使用我的库的任何代码进行通信。
我也看过 https://github.com/chuckpreslar/emission ,但我不确定这是否可以接受,或者是否有更好的(“最佳实践”)做事方式。
最佳答案
Go 和 Node.js 非常不同。 Node.js 仅通过回调支持并发。可能有多种方式来修饰它们,但它们基本上是回调。
在 Node.js 中,没有并行性; Node.js 具有单线程运行时。当 Node.js async
用于实现所谓的“并行”执行时,它不是 Go 中使用的并行,而是并发。
Concurrency is not parallelism在围棋世界中。
Go 具有基于通信顺序进程 (CSP) 的显式并发性,这是牛津大学 Tony Hoare 构想的数学基础。运行时通过将称为 goroutine 的协作进程按时间 slice 到可用的 CPU 内核上来交错它们。在每个 goroutine 中,代码都是单线程,因此很容易编写。在简单的情况下,goroutines 之间不共享数据;相反,消息通过 channel 在它们之间传递。这样就不需要回调了。
当 goroutines 在等待 I/O 时被阻塞,这没有关系,因为它们在解除阻塞之前不会使用任何 CPU 时间。它们的内存占用很小,您可以拥有非常多的内存。因此 I/O 操作也不需要回调。
由于 Go 和 Node.js 的执行模型几乎完全不同,因此尝试将代码从一个移植到另一个很可能会导致非常笨拙的解决方案。最好从最初的需求开始,从头开始实现。
有可能使用函数参数来扭曲 Go 并发模型,使其表现得像回调。这将是一个坏主意,因为它不是惯用的,并且会失去 CSP 提供的好处。
关于node.js - Go 中的 channel 和 node.js 中的发射器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27704995/