Go中的通道和node.js中的发射器?

时间:2014-12-30 11:53:30

标签: node.js go eventemitter

Go是否具有与node.js等效的等价物。 "发射极"

我自己教我去写一个我写的node.js库。在节点版本中,一旦发生某些事情,该库就会发出一个事件(例如,它在UDP端口1234上侦听,当接收到" ABC"时,#34; abcreceived"被发出,因此调用代码可以响应必要时(例如发回" DEF")

我已经看过Go中的频道(目前我正在阅读它们),但由于我还不熟悉这种语言,我不知道是否(或如何,就此而言) )可用于与使用我的库的任何代码进行通信。

我也见过https://github.com/chuckpreslar/emission,但我不确定这是否可以接受,或者是否有更好的(&#34;最佳实践&#34;)做事方式。< / p>

2 个答案:

答案 0 :(得分:1)

因此,通过阅读其他人的Go代码和评论中的一些链接来解决我的问题,我认为渠道是可行的方式。

在我的库代码中(半伪代码):

// Make a new channel called "Events"
var Events = make(chan 

func doSomething() {
    // ...
    Events <-"abcreceived" // Add "abcreceived" to the Events channel
}

在将使用我的库的代码中:

evt := <-mylib.Events

switch evt {
    case "abcreceived":
        sendBackDEF()
        break
    // ...
}

我仍然更喜欢node.js的EventEmitter(因为你可以轻松地传回数据)但是对于简单的事情,这应该足够了。

答案 1 :(得分:1)

Go和Node.js非常不同。 Node.js仅通过回调支持并发。可能有各种各样的方法来打扮它们,但它们基本上是回调。

在Node.js中,有 no 并行性; Node.js有一个单线程运行时。当Node.js async用于实现所谓的“并行”执行时,它在Go中使用的意义上并不是并行的,而是并发的。

Go世界中的

Concurrency is not parallelism

Go具有基于通信顺序进程(CSP)的显式并发性,这是牛津大学Tony Hoare设想的数学基础。运行时将称为goroutine的协作进程通过时间切片到可用的CPU内核上进行交错。在每个goroutine中,代码是单线程,因此易于编写。在简单的情况下,goroutines之间没有共享数据;而是消息沿着渠道在它们之间传递。通过这种方式,不需要回调。

当goroutines被阻塞等待I / O时,这没关系,因为他们在解除阻塞之前不会使用任何CPU时间。它们的内存占用很小,你可以拥有非常多的内存。因此,I / O操作也不需要回调。

因为Go和Node.js的执行模型大致不同,尝试将代码从一个移植到另一个很可能会导致非常笨拙的解决方案。最好从原始要求开始,从头开始实施。

可以使用函数参数扭曲Go并发模型,使其行为类似于回调。这将是一个糟糕的主意,因为它不会是惯用的,会失去CSP带来的好处。