在Scala中实现Go的并发模式难吗?
毫无疑问,Go的语法比
Scala简单得多.它的语言功能也较少.我非常喜欢用Go编写并发代码的简易性.
事实证明,高性能代码是无阻塞代码(见http://norvig.com/21-days.html#Answers),Go和Scala都非常擅长这一点. 我的问题是如何通过实现相同的并发模式,如何在Scala中编写与Go程序完全相同的程序.我想到的第一件事就是以与Channels类似的方式使用Futures. 我在找 > Scala中Go的并发模式的可能实现 任何帮助深表感谢. [编辑] Go并发模式的一些例子 扇入 func fanIn(input1,input2 <-chan string) <-chan string { c := make(chan string) go func() { for { select { case s := <-input1: c <- s case s := <-input2: c <- s } } }() return c } 超时粒度(一个频道与整个对话) 在多个实例之间复制服务调用并返回第一个实例的值以进行响应. (这是使用一捆模式) 全部用:没有锁.没有条件变量.没有回调. 解决方法
Go具有内核到核心语言的并发功能,而Scala使用Java的java.util.concurrent中的
concurrent package和并发原语.
在Scala中,使用基于线程的并发或Actor Model是惯用的,而Go并发基于Hoare’s Communicating Sequential Processes. 虽然两种语言之间的并发原语不尽相同,但看起来有一些相似之处. 在Go中,通常使用Goroutines和Channels来实现并发性.还有其他更传统的low level synchronization primitives such as mutexes and wait groups. 在Scala中,据我所知,任何声明为“Runnable”的类都将在一个单独的线程中启动,并且不会阻塞.这在功能上类似于goroutines. 在Scala中,队列可用于以类似的方式在例程中将信息传递给Go中的Channels. 编辑:正如Chuck所指出的那样,“Scala的队列和Go通道之间的关键区别在于,默认情况下,Go的通道会阻止写入,直到某些东西准备从它们读取并阻止读取,直到某些东西准备好写入它们. ”.这需要写入任何通道的Scala实现. 编辑2:正如Maurício Linhares所指出的那样,“你可以使用Async在scala中进行没有可见回调的并发 – github.com/scala/async – 但是如果没有回调你就无法做到这一点,这是不可能的. JVM目前正在实施.“ 感谢所有人的建设性意见. 有关详情,请参阅: > http://golang.org/doc/effective_go.html#concurrency (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |