- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我一直在研究学习 Erlang/OTP,因此,我一直在阅读(好吧,略读)关于 actor 模型的内容。
据我了解,actor 模型只是一组函数(在 Erlang/OTP 中称为“进程”的轻量级线程中运行),它们仅通过消息传递相互通信。
用 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 的一个实例。参与者之间仅通过消息传递进行通信。 (即推)。 Actor 在初始化时使用中央 map 注册自己,这允许其他 Actor 找到它们,并允许中央功能通过它们运行。
现在,我知道我遗漏了,或者更确切地说,在这里掩盖了一个重要问题,即:缺乏让步意味着单个 Actor 可能会不公平地消耗过多的时间。但是跨平台协程是在 C++ 中使这变得困难的主要因素吗? (例如 Windows 有纤维。)
还有什么我遗漏的,或者模型真的这么明显吗?
最佳答案
C++ 代码不处理公平、隔离、故障检测或分发,这些都是 Erlang 作为其参与者模型的一部分带来的。
beam SMP 模拟器还带来了参与者的 JIT 调度,将它们移动到目前利用率最低的核心,并且如果不再需要某些核心上的线程,它们也会休眠。
此外,所有用 Erlang 编写的库和工具都可以假定这是世界的运作方式,并相应地进行设计。
这些事情在 C++ 中并非不可能做到,但如果你加上 Erlang 几乎适用于所有主要硬件和操作系统配置的事实,它们就会变得越来越难。
编辑:刚刚找到 Ulf Wiger 的描述关于他认为 erlang 风格的并发是什么。
关于c++ - Actor 模型 : Why is Erlang/OTP special? 你能用另一种语言吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8107612/
我是一名优秀的程序员,十分优秀!