Actor模型与面向对象模型

21

我在网上搜索了很长时间,找不到面向对象模型中被Actor模型克服的具体缺点。请给我一些指引和解释。

先行谢过。


2
https://anthonylebrun.silvrback.com/actors-vs-objects - reaanb
1
@reaanb 很棒的链接。谢谢 - Suga Raj
1
相关:https://dev59.com/t2Up5IYBdhLWcg3wo4qc - jaco0646
2个回答

32

术语面向对象编程最初来自Alan Kay和Smalltalk,强调消息传递作为其主要特点,这是OOP最初的含义。

随着C++和Java的出现,面向对象编程一词的意义略有不同。它变成了一些人所谓的“类导向编程”。

Actor模型重新强调了最初OOP的消息传递概念成为核心基础。

Actor模型优点:

  • 在分布式系统中工作效果更好
  • 在许多情况下,从架构上更易于理解
  • 用多个“actor”模拟实际世界现象/复杂系统
  • 与函数式编程风格(参见Smalltalk)大致兼容

Actor模型缺点:

  • 更难以推理算法,因为它不仅存在于一个位置。它被分割到不同的actors/文件中,你必须追踪代码。
  • 同样,多个算法可以混合在多个actors之间。 因此,您可能会读取Actor的代码来跟踪算法,但会因其他算法也混杂在同一个Actor中而感到困惑。
  • 传统的信号量样式锁定不可能。 必须使用更复杂的STM(Software Transactional Memory)样式。
  • 难以获得“返回值”。Actor模型是“发射并忘记”的。你必须想办法将“返回值”传回给最初的请求者。这增加了许多开销,因为现在你必须设置一种接收方式,并通过整个系统传递上下文(uniqueId / taskId)。你还需要管理状态以保持该信息直到“响应”返回。如果没有Actor模型,它们只是块作用域内的局部变量。

  • 这实际上是对@SugaRaj的答案的很好的补充。 - Ryan
    除了Simula-67和Erlang之外,没有其他编程语言可以让多个对象同时拥有它们自己的生命周期。而Smalltalk只允许一条消息改变对象的内部状态,这与C++/Java完全相同。 - Bulat

    18

    面向对象模型的缺点:

    1. 传统的面向对象编程语言并未考虑并发问题,因此很容易出现竞争条件,并共享状态。
    2. 程序员必须使用锁定机制来识别和解决所有可能存在的问题区域。
    3. 对于简单的程序来说,实现锁定是很容易的。但随着程序变得越来越复杂,锁定的实现也变得越来越复杂。

    Actor模型通过使用无共享状态(share nothing)模型来解决问题,从而不影响并发性和不需要锁定机制。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接