百科问答小站 logo
百科问答小站 font logo



为什么我觉得 Actor 很难用? 第1页

  

user avatar   david-dong-20 网友的相关建议: 
      

Actor模型本质上是计算模型,是抽象度很高的模型,不要和具体的技术搞混了。Actor模型的类比应该是图灵机和Lambda-calculus之类的。

稍微解释一下,我们现在说的Actor模型,指的应该是Gul Agha(现在在UIUC)在1985年的论文:Actors: A Model of Concurrent Computing in Distributed Systems里使用的Actor模型(被

@bhuztez

指出Actor模型是Carl Hewitt提出的,查了一下,这个模型一开始是Carl Hewitt等人在1973年提出的,直到1985年Gul Agha在他的博士论文里发展了transition-based semantic model,完善了Actor Model Theory,那么我们就按照这篇论文里的Actor模型来好了)。这个模型在一个比具体的programming lanugage更抽象的层面上,论文里说"abstract machine",或者说computation model,去定义一个computational element的本质。这是一个computation的模型,不应该拿它和一些具体的技术来进行比较(比如thread)。

论文里提出,可用于计算的本质元素包括:Sequential Processes,Functions transforming data values,和Actor。Sequential Processes是类似于状态机的概念,是从C语言开始的大多数人对编程语言的理解,一个程序是一系列状态的改变,这里面是允许做并行的计算的(一般是共享内存),但是需要仔细考虑顺序和状态的变化;Functions transforming data values就是基于lambda-calculus的函数式模型,由于function中间不含状态,简化了一部分并行的难度,但是由于现实世界有些情况是必须基于历史的,模型里有用feedback之类的来处理;所谓Actor模型是Sequential Processes和Functions transforming data values两者的结合,可以理解为是综合了过程式计算和函数式计算的一个计算模型。一个Actor会把接收到的消息映射为三个部分,传给其他Actor的消息,一个新的行为(用来处理下一个消息),和创造一些新的Actors。这个模型的好处在于它既有函数式模型里的隔离的概念,因为对别的Actor来说,Actor内部的状态改变并不会影响他们自己,所以对一个Actor来说,别的Actor就好像不存在状态一样;但是另一方面,对每个Actor自己来说,它是有“历史”的,这是Sequential Processes模型里的概念。Actor模型的强大之处在于它是可以完全表达出任何Sequential Processes或者Functions transforming data values的系统的,但是反之则不一定能表达出来。事实上现代的分布式系统,其实或多或少都借鉴了一些Actor模型,比如著名的RPC机制。

基本上如果你把一个进程的概念放进一个分布式系统里,这个进程如果在这个分布式系统里,不是必须在本地机器调用的话,我觉得这个进程事实上就是一个Actor了。因为跨了不同的机器,根本没法使用共享内存,肯定是传递消息。

看到这里我们大概会有个概念,Actor模型主要其实不是针对并行计算的,最主要的还是在分布式计算里面。当然,即使在并行计算里,采用Actor模型也是有好处的,最主要的是比较起共享内存的并行方式,Actor模型会提供一定程度上的抽象,减少一些细节。或者说,如果是在单机的并行计算里,Actor模型就比较近似于函数式编程了。

至于同步和锁........我觉得这个跟Actor并不矛盾啊.......Actor总体上是个异步的模型,Actor之间也没有共享内存,但是同步是可以构建在异步之上的啊,如果需要同步也可以做的,Actor之间虽然没有共享内存,但是Actor自己也可以加锁咯,不过这样似乎没啥意义......

函数式编程,不可变状态,用不用Actor确实都可以做到,因为Actor本来就是吸收了函数式的一部分特征做出的计算模型。但是如果考虑在分布式环境下,如果有很多台计算机的时候,Actor模型可以提供的抽象能力就要更强了,它可以在语言层面上提供对分布式的支持。但是这种情况下用Actor模型表达出的系统就很难直接用函数式或者过程式表达出来,往往要提供其他的工具作为支持。

原始的论文在这里:

cypherpunks.to/erights/

并非研究此方向的,希望有大牛指教下。

------------------------------------------------------------------------------------------

原本以为差不多明白Actor模型是什么东西了,仔细研究了一下之后发现其实跟我想的还有很多地方都不一样,根据看到的一些论文的描述,Actor模型现在用图灵机模型(也就是我们平时用的计算机)模拟其实会非常低效的(其实没有深入看,不太明白为什么),而且对于非决定性问题可能会出现问题(也没有太看懂)。所以总体来说,Actor模型也只是个理论模型,真正完整的实现基本上就没有...........

不过根据Actor模型实现的各种变种的编程语言和框架还是蛮多的,也对分布式系统的研究有一定指导意义~




  

相关话题

  汇编下call和ret指令是否有内存屏障的作用? 
  C# 中的原子的基础数据类型能否用于同步多线程? 
  多线程下载一个大文件的速度更快的真正原因是什么? 
  有了线程,为什么还要有协程? 
  Golang、Kotlin、C#、JS、Python等都有协程,市面上的协程有什么本质上的区别? 
  .Net core 自旋锁 vs Lock statement/Monitor 的开销在哪? 
  go mutex阻塞线程吗,如果不阻塞,为什么呢? 
  为什么编译器过度优化导致线程安全问题? 
  c#中虽然异步和多线程是两码事,但是是否异步微软提供的async函数内部还是多线程去实现的? 
  如何修改shared_ptr智能指针,让他支持多线程? 

前一个讨论
在美国,faculty 的一天是这样的吗?
下一个讨论
你是如何决定要去读Ph.D.的?





© 2024-11-25 - tinynew.org. All Rights Reserved.
© 2024-11-25 - tinynew.org. 保留所有权利