【发布时间】:2010-12-21 02:03:24
【问题描述】:
现在有很多关于不使用锁和使用像 Erlang 这样的消息传递方法的讨论。或者关于在函数式编程与 C++/Java 中使用不可变数据结构。
但我关心的是以下几点:
- AFAIK,Erlang 不保证消息传递。消息可能会丢失。如果您不得不担心消息丢失,算法和代码会不会再次膨胀并变得复杂?无论您使用何种分布式算法,都不得依赖于有保证的消息传递。
- 如果消息是一个复杂的对象怎么办?复制和发送消息与将消息保存在共享位置(例如两个进程都可以访问的数据库)相比,是否存在巨大的性能损失?
- 您真的可以完全取消共享状态吗?我不这么认为。例如在数据库中,您必须访问和修改相同的记录。您不能在那里使用消息传递。您需要锁定或假设乐观并发控制机制,然后对错误进行回滚。 Mnesia 是如何工作的?
- 此外,您不必总是担心并发问题。任何项目也将有一大段代码,它们根本不需要对并发或事务做任何事情(但它们确实需要考虑性能和速度)。许多这些算法依赖于共享状态(这就是为什么传递引用或指针如此有用)。
鉴于这个事实,用 Erlang 等编写程序是一件痛苦的事情,因为您无法做任何这些事情。可能是,它使程序变得健壮,但对于解决线性规划问题或计算凸包等问题,性能更重要,当算法与并发/事务无关时,强制不变性等是一个糟糕的决定.不是吗?
【问题讨论】:
-
在不可变数据结构的上下文中,“共享数据”与“消息传递”的成本取决于您使用的 VM。传递消息是否涉及复制或仅传递指针只是 VM 是如何实现的问题。 BEAM VM 被设计为具有每个进程的垃圾收集,这意味着消息传递是通过实际复制发送的数据来实现的。只是我的 2 个填充物。
标签: concurrency transactions erlang distributed-computing