【发布时间】:2010-03-26 15:40:10
【问题描述】:
我读了一本书(Bruce A. Tate 的七周内的七种语言)中关于 Matz(Ruby 的发明者)的一章,说“我将删除线程并添加演员,或其他一些更高级的并发功能”。
- 为什么以及如何让参与者模型成为替代线程的高级并发模型?
- “高级并发模型”还有哪些其他模型?
【问题讨论】:
标签: ruby multithreading concurrency
我读了一本书(Bruce A. Tate 的七周内的七种语言)中关于 Matz(Ruby 的发明者)的一章,说“我将删除线程并添加演员,或其他一些更高级的并发功能”。
【问题讨论】:
标签: ruby multithreading concurrency
与其说是actor模型会取代线程;在 CPU 级别,进程仍将有多个线程,这些线程在处理器内核上调度和运行。 Actor 的想法是用一种模型替换这种潜在的复杂性,其支持者认为,这种模型使程序员更容易编写可靠的代码。
actor 的想法是拥有单独的控制线程(Erlang 术语中的进程),它们专门通过消息传递进行通信。更传统的编程模型是共享内存,并使用互斥锁协调线程之间的通信。这仍然发生在 Actor 模型的表面之下,但细节被抽象掉了,并且基于消息传递给程序员提供了可靠的原语。
重要的一点是参与者不一定将 1-1 映射到线程——在 Erlang 的情况下,他们肯定不会——每个内核线程通常会有很多 Erlang 进程。所以必须有一个调度器将actor分配给线程,并且这个细节也从应用程序程序员中抽象出来。
如果您对 Actor 模型感兴趣,您可能想看看它在 Erlang 或 Scala 中的工作方式。
如果您对其他类型的新并发热点感兴趣,您可能需要查看software transactional memory,这是一种可以在 clojure 和 haskell 中找到的不同方法。
值得一提的是,创建高级并发模型的许多更积极的尝试似乎都发生在函数式语言中。可能是因为相信(我自己喝了一些这种kool-aid)不变性使并发更容易。
【讨论】:
我最喜欢这个问题,正在等待答案,但既然还没有,这里是我的..
演员模型为何以及如何成为 高级并发模型 替换线程?
Actor 可以摆脱可变的共享状态,这很难正确编码。 (我的理解是)actors 基本上可以认为是具有自己线程的对象。您在 Actor 之间发送消息,这些消息将被 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
【讨论】:
请参阅数据流编程。这是一种方法,是通常的 OOP 设计之上的一层。一句话:
编程正在进行 3 层:
维基百科文章是了解业务的良好起点:http://en.wikipedia.org/wiki/Flow-based_programming 另见“演员模型”、“数据流编程”等。
【讨论】:
请看下面的论文
【讨论】:
【讨论】: