[c++] 演员模型:为什么是erlang特别的? 或者,为什么你需要另一种语言呢?



Answers

我不喜欢引用自己,而是从维尔丁的第一编程规则

在另一种语言中任何足够复杂的并发程序都包含一个特殊的非正式指定的Erlang的一半错误执行的缓慢实现。

关于格林普斯。 乔(阿姆斯特朗)也有类似的规则。

问题不在于执行演员,这并不困难。 问题是让所有的东西一起工作:进程,通信,垃圾收集,语言原语,错误处理等等。例如,使用OS线程缩小比例,所以你需要自己做。 这就像试图“销售”一种面向对象语言,你只能拥有1k个对象,而且它们很难创建和使用。 从我们的角度来看,并发是构建应用程序的基本抽象。

越来越多,所以我会停下来。

Question

我一直在研究学习erlang,结果,一直在阅读(好,撇取)演员模型。

据我所知,actor模型只是一组函数(在erlang中称为“进程”的轻量级线程中运行),它们之间只能通过消息传递进行通信。

这在C ++或任何其他语言中实现似乎相当简单:

class BaseActor {
    std::queue<BaseMessage*> messages;
    CriticalSection messagecs;
    BaseMessage* Pop();
public:
    void Push(BaseMessage* message)
    {
        auto scopedlock = messagecs.AquireScopedLock();
        messagecs.push(message);
    }
    virtual void ActorFn() = 0;
    virtual ~BaseActor() {} = 0;
}

每个进程都是派生的BaseActor的一个实例。 参与者之间只能通过消息传递进行通信。 (即推)。 行动者注册自己的初始化中央地图,允许其他行为者找到它们,并允许中央功能贯穿它们。

现在,我明白我错过了,或者更确切地说,在这里重申了一个重要问题,即:缺乏屈服意味着单个演员可能不公平地消耗过多的时间。 但是跨平台的协程是C ++中最重要的东西吗? (例如Windows有光纤。)

还有什么我想念的,或者是模型真的很明显?

我绝对没有试图在这里开始一场火焰战争,我只是想了解我错过了什么,因为这基本上是我已经做的能够有点理由关于并发代码。




Casablanca是另一个演员模特儿新人。 典型的异步接受如下所示:

PID replyTo;
NameQuery request;
accept_request().then([=](std::tuple<NameQuery,PID> request)
{
   if (std::get<0>(request) == FirstName)
       std::get<1>(request).send("Niklas");
   else
       std::get<1>(request).send("Gustafsson");
}

(就我个人而言,我发现github.com/actor-framework/actor-framework在隐藏匹配好的界面的模式方面做得更好。)







Related