更新:这个问题包含一个错误,使基准毫无意义。 我将尝试一个比较F#和Erlang的基本并发function的更好的基准,并在另一个问题上询问结果。 我正在尝试去理解Erlang和F#的性能特点。 我发现Erlang的并发模型非常吸引人,但是由于互操作性的原因,我倾向于使用F#。 尽pipe开箱即用的F#并没有提供像Erlang的并发原语这样的东西 – 从我所知道的asynchronous和MailboxProcessor只涵盖了Erlang很好的一小部分 – 我一直在试图理解F#中可能的性能明智的。 在Joe Armstrong编程的Erlang书中,他指出在Erlang中进程非常便宜。 他使用(大致)下面的代码来certificate这个事实: -module(processes). -export([max/1]). %% max(N) %% Create N processes then destroy them %% See how much time this takes max(N) -> statistics(runtime), statistics(wall_clock), L = for(1, N, fun() -> spawn(fun() -> wait() end) end), {_, Time1} = statistics(runtime), {_, Time2} = statistics(wall_clock), lists:foreach(fun(Pid) -> […]
.net / c#有没有很好的执行actor并发模型 ? 我必须优化交stream#例程,我认为演员模型完全适合我的问题的解决scheme。 不幸的是,我只有scala实现的经验。
我一直在研究学习erlang,因此,一直在阅读(好吧,略读)演员模型。 根据我的理解,actor模型只是一组函数(在erlang中称为“processes”的轻量级线程中运行),它们之间只能通过消息传递进行通信。 在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的一个实例。 参与者之间只能通过消息传递进行交stream。 (即推)。 行动者注册自己的初始化中央地图,允许其他行为者find他们,并允许中央function贯穿其中。 现在,我明白我错过了,或者更确切地说,在这里重要的一个问题,即:缺乏屈服意味着单个演员可以不公平地消耗过多的时间。 但是跨平台的协程是使C ++变得困难的主要原因吗? (例如Windows有光纤。) 还有什么我失踪,或者是模型真的这是显而易见的? 我绝对不是试图在这里开始一场激烈的战争,我只是想明白我错过了什么,因为这基本上是我已经做了一些有关并发代码的原因。
有什么好的和简短的解释演员如何工作相比线程? 一个线程不能被视为一个演员,并发送消息到其他线程? 我看到有些不同,但对我来说不是很清楚。 我可以通过不同的线程使用任何语言的Actor吗?
我已经和Node.js一起工作了一段时间,认为自己对Java很好。 但是我刚刚发现了Akka ,并立即对其演员模式感兴趣(据我所知)。 现在,假设我的JavaScript技能与我的Scala / Java技能相当,我想把重点放在两个系统的实用性上。 特别是在Web服务方面。 我的理解是,Node在处理许多并发操作方面非常出色。 我想象一下,一个好的Node资源pipe理系统的Web服务在处理很多用户同时提交更改(在一个大型的,大stream量的应用程序中)方面会很出色。 但是在阅读完Akka的演员之后,它会觉得它会在同样的事情上performance出色。 我喜欢把工作减less到一口大小的想法。 此外,多年前我涉足Erlang,并爱上了它所使用的消息传递系统。 我在处理复杂业务逻辑的许多应用程序上工作,我认为是时候跳入一个或另一个。 尤其是升级传统的Struts和C#应用程序。 无论如何,避免圣战,这两个体系有什么根本的不同呢? 看起来两者都是为了同一个目标。 也许Akka的“自我修复”架构具有优势。 编辑 看起来我正在接近选票。 请不要把这个问题当作“哪个更好,节点还是阿卡?”。 我正在寻找的是像Node这样的基于事件驱动的库和Akka等基于actor的基本差异。
我正试图了解干扰模式 。 我观看了InfoQ的video并试图阅读他们的论文。 我知道有一个环形缓冲区涉及,它被初始化为一个非常大的数组,以利用caching局部性,消除新内存的分配。 这听起来像是有一个或多个primefaces整数跟踪位置。 每个“事件”似乎都得到了一个唯一的ID,并且它的环中的位置是通过相对于环的大小等来查找其模数而find的。 不幸的是,我并没有直观的感觉。 我做了很多交易应用,研究了演员模型 ,看了SEDA等。 他们在介绍中提到,这种模式基本上是路由器如何工作的; 但是我还没有find路由器如何工作的任何好的描述。 有没有更好的解释指针?