演员模型取代线程模型?

时间:2010-03-26 15:40:10

标签: ruby multithreading concurrency

我读了一本书中的一章(Bruce A. Tate的七周七种语言)关于Matz(Ruby的发明者)说'我会删除线程并添加actor,或者其他一些更高级的并发功能'。

  • 为什么以及如何将actor模型作为替代线程的高级并发模型?
  • “高级并发模型”还有哪些其他模型?

5 个答案:

答案 0 :(得分:15)

演员模型不会取代线程;在cpu级别,进程仍将具有多个线程,这些线程在处理器核心上进行调度和运行。演员的想法是用一个模型取代这个潜在的复杂性,它的支持者认为,这使得程序员更容易编写可靠的代码。

参与者的想法是拥有单独的控制线程(Erlang用语中的过程),它们只通过消息传递进行通信。更传统的编程模型是共享内存,并使用互斥锁协调线程之间的通信。这仍然发生在actor模型的表面下,但细节被抽象掉了,程序员根据消息传递给出了可靠的原语。

一个重点是演员不一定将1-1映射到线程 - 在Erlang的情况下,他们肯定不会 - 每个内核线程通常会有很多Erlang进程。因此必须有一个调度程序将actor分配给线程,这个细节也从应用程序程序员中抽象出来。

如果您对演员模型感兴趣,可能需要查看它在ErlangScala中的工作方式。

如果您对其他类型的新并发热点感兴趣,您可能需要查看software transactional memory,这是一种可以在clojure和haskell中找到的不同方法。

值得一提的是,许多更积极的创建高级并发模型的尝试似乎都发生在函数式语言中。可能由于这种信念(我自己喝了一些kool-aid),不变性使得并发性变得更加容易。

答案 1 :(得分:3)

我把这个问题作为我的最爱,我正在等待答案,但既然还没有,那么这就是我的......

  

演员模型为什么以及如何成为一个   高级并发模型   替换线程?

演员可以摆脱可变的共享状态,这很难正确编码。 (我的理解是)actors基本上可以认为是具有自己的线程的对象。您将在actor中的线程排队和使用的actor之间发送消息。因此,演员中的任何状态都被封装,并且不会被共享。所以很容易编码正确。

另见http://www.slideshare.net/jboner/state-youre-doing-it-wrong-javaone-2009

  

其他哪些型号是'先进的   并发模型'?

请参阅http://www.slideshare.net/jboner/state-youre-doing-it-wrong-javaone-2009

答案 2 :(得分:2)

参见数据流编程。这是一种方法,它是通常的OOP设计之上的一层。换句话说:

  • 有一个场景, Components 所在的场景;
  • 组件有端口生产者(输出,生成消息)和消费者(输入,处理消息);
  • 组件之间预先定义了消息:一个组件的生产者端口与另一个组件的消费者绑定。

编程正在进行3层:

  • 编写数据流系统(语言,框架/服务器,组件API),
  • 编写组件(系统,基本和面向域的组件),
  • 创建数据流程序:将组件放入场景中,并在它们之间定义消息。

维基百科文章是了解业务的良好起点:http://en.wikipedia.org/wiki/Flow-based_programming 另请参阅“actor model”,“dataflow programming”等。

答案 3 :(得分:1)

请提供以下文件

Actor Model of Computation

答案 4 :(得分:1)