加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中实现Go的并发模式难吗?

发布时间:2020-12-16 19:08:56 所属栏目:安全 来源:网络整理
导读:毫无疑问,Go的语法比 Scala简单得多.它的语言功能也较少.我非常喜欢用Go编写并发代码的简易性. 事实证明,高性能代码是无阻塞代码(见http://norvig.com/21-days.html#Answers),Go和Scala都非常擅长这一点. 我的问题是如何通过实现相同的并发模式,如何在Scala
毫无疑问,Go的语法比 Scala简单得多.它的语言功能也较少.我非常喜欢用Go编写并发代码的简易性.

事实证明,高性能代码是无阻塞代码(见http://norvig.com/21-days.html#Answers),Go和Scala都非常擅长这一点.

我的问题是如何通过实现相同的并发模式,如何在Scala中编写与Go程序完全相同的程序.我想到的第一件事就是以与Channels类似的方式使用Futures.

我在找

> Scala中Go的并发模式的可能实现
>如果Go构造很难在Scala中完全模拟
>代码片段

任何帮助深表感谢.

[编辑] 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
}

超时粒度(一个频道与整个对话)

在多个实例之间复制服务调用并返回第一个实例的值以进行响应. (这是使用一捆模式)

全部用:没有锁.没有条件变量.没有回调.
(Scala期货使用回调)

解决方法

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
> http://www.scala-lang.org/api/current/index.html#scala.concurrent.package
> http://twitter.github.io/scala_school/concurrency.html
> https://github.com/scala/async
> http://akka.io/docs/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读