我们将使用Clojure编写一个并发程序,该程序将从大量传入的邮件中提取关键字,这些邮件将与数据库进行交叉检查。 我的一个队友build议使用Erlang编写这个程序。 在这里,我想说明一些我对函数式编程的新东西,所以我有点怀疑clojure是编写这个程序的好select,还是Erlang更适合。
我正在阅读SašaJurić的“Elixir in Action”一书,第一章说: Erlang进程完全相互隔离。 它们不共享内存,一个进程崩溃不会导致其他进程崩溃。 Java线程也不是这样吗? 我的意思是,当Java线程崩溃时,它也不会崩溃其他线程 – 尤其是,如果我们正在查看请求处理线程(让main线程免受这种干扰)
在看Go和Erlang的并发方法时,我注意到它们都依赖于消息传递。 这种方法显然减轻了对复杂锁的需求,因为没有共享状态。 但是,考虑许多客户机需要对内存中的单个大型数据结构进行并行只读访问的情况 – 如后缀数组。 我的问题: 将使用共享状态更快,并使用更less的内存比消息传递,因为数据是只读的,只需要在一个单一的位置存在锁通常是不必要的? 在消息传递上下文中如何处理这个问题? 会不会有一个访问数据结构的进程,客户端只需要按顺序请求数据呢? 或者,如果可能的话,数据是否会被分块来创build多个处理大块的进程? 鉴于现代CPU和内存的架构,这两种解决scheme之间是否有很大的区别?即,多核可以共享内存是否可以被并行读取?这意味着没有任何硬件瓶颈,否则这两个解决scheme会大致执行相同的操作?
更新:这个问题包含一个错误,使基准毫无意义。 我将尝试一个比较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) -> […]
我正在尝试使用erlang:trace / 3和dbg模块来跟踪实时生产系统的行为,而不必closures服务器。 这个文档是不透明的 (说得温和些),在网上看来没有任何有用的教程。 我花了一整天的时间试图做的是通过尝试使用dbg:c和dbg:p来应用跟踪到module:function的函数来捕获特定函数中发生的事情。 有没有人有一个简单的解释如何使用跟踪现场Erlang系统?
因为并发编程变得越来越重要,我想知道你对Erlang和Scala的看法。 在我看来,斯卡拉拥有比Erlang更大的用户群和更光明的未来。 此外,斯卡拉是一种Java。 我知道这些问题总是有点主观,但未来的投资会是怎样的:Erlang或Scala。 甚至是另一种语言?
在编程语言中使用primefaces数据types的function有多有用? 一些编程语言有primefaces或符号的概念来表示一个常数的种类。 我遇到的语言(Lisp,Ruby和Erlang)有一些差异,但是在我看来,一般的概念是相同的。 我对编程语言devise很感兴趣,我想知道在现实生活中提供primefacestypes的价值。 其他语言如Python,Java,C#在没有它的情况下似乎做得相当好。 我没有真正的Lisp或Ruby经验(我知道的语法,但没有在一个真实的项目中使用)。 我已经使用Erlang足够用于这个概念了。
许多程序使用如下命令返回其版本号: $ program –version program (platform info) v1.2.3 这对于编写程序的安装或维护脚本以及系统pipe理员和朋友的一些其他受控自动化魔术非常有用。 问题 如何轻松获得Erlang(OTP)的版本号 ? networking上 这里有一些令人不满意的解决scheme([1]和其他教程/ Erlang文档): 模拟器 $ erl 1> erlang:system_info(otp_release). "R13B03" 很难脚本。 我还没有find一种方法来从shell提示符执行单个命令。 发布文件 $ cat /usr/lib/erlang/releases/RELEASES [{release,"OTP APN 181 01","R13B03","5.7.4", [{kernel,"2.13.4","/usr/lib/erlang/lib/kernel-2.13.4"}, {stdlib,"1.16.4","/usr/lib/erlang/lib/stdlib-1.16.4"}, {sasl,"2.1.8","/usr/lib/erlang/lib/sasl-2.1.8"}], permanent}]. parsing天堂(与壳)。 替代scheme也可能是检查安装path,但这不是可移植的(我的安装path不包括版本,为一个)。 个人上下文:我正在编写一个脚本来在几台机器上安装与插件相同版本的RabbitMQ。 一些插件对OTP版本的要求很低,这就是这个问题的开始。 [1] http://forum.trapexit.org/viewtopic.php?p=42946
我一直在研究学习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有光纤。) 还有什么我失踪,或者是模型真的这是显而易见的? 我绝对不是试图在这里开始一场激烈的战争,我只是想明白我错过了什么,因为这基本上是我已经做了一些有关并发代码的原因。
你真的“试过”(意味着编程,而不只是读一篇文章)Erlang,并决定反对它的一个项目? 如果是这样,为什么? 此外,如果您select回到您的旧语言,或者使用F#,Haskell,Clojure,Scala或其他function语言,那么这也是非常重要的,并说明原因。