- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
毫无疑问,Go 的语法比 Scala 简单得多。它还具有较少的语言功能。我非常喜欢使用 Go 轻松编写并发代码。
事实证明,高性能代码是非阻塞代码(参见 http://norvig.com/21-days.html#Answers),Go 和 Scala 都非常擅长这一点。
我的问题是关于如何通过实现相同的并发模式,用 Scala 编写与 Go 程序行为方式完全相同的程序。首先想到的是以与 Channels 类似的方式使用 Futures。
我在找
非常感谢任何帮助。
[编辑] Go 并发模式的几个例子 http://talks.golang.org/2012/concurrency.slide
扇入
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
}
超时粒度(一个 channel 与整个对话)
在多个实例之间复制服务调用并返回第一个响应的值。 (这是使用了一组模式)
全部:无锁。没有条件变量。没有回调。(Scala Futures 使用回调)
最佳答案
Go 在核心语言中内置了并发特性,而 Scala 使用 concurrent package和来自 Java 的 java.util.concurrent
的并发原语。
在 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 中的 channel 类似。
编辑:正如 Chuck 所指出的那样,“Scala 的队列和 Go channel 之间的关键区别在于,默认情况下,Go 的 channel 在写入时阻塞,直到准备好从它们读取内容,并在读取时阻塞,直到准备好写入它们。”。这需要写入 channel 的任何 Scala 实现中。
编辑 2:正如 Maurício Linhares 所指出的那样,“您可以在 Scala 中使用 Async 进行并发而无需可见的回调 - github.com/scala/async - 但如果没有回调,您根本无法做到这一点,鉴于 JVM 当前的实现方式,这是不可能的。 “。
感谢大家的建设性意见。
有关详细信息,请参阅:
关于scala - 在 Scala 中实现 Go 的并发模式难吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20206186/
我想根据用户在第一个下拉框中选择的值来填充第二个下拉框。这是我到目前为止所做的: 在 PHP 文件中: function displayDropDown() { $table_tester =
我需要你的帮助。 我有一个具有如下架构的数据库: 团队: ID 姓名 fundation_date 匹配: ID 日期 id_local_team(团队的外键) id_visit_team (团队的外
我是一名优秀的程序员,十分优秀!