events - erlang 事件与线程相比有多重要?

标签 events event-handling erlang

不确定这是否可取,但我正在阅读 erlang 并且我正在查看 gen_event 并且我想知道将它用于完整的面向事件的编程的开销是多少,例如我将在 Node.Js 中使用。

让事件处理任务与在 erlang 中生成新线程来执行相同任务的开销是多少。

谢谢。

最佳答案

Erlang 语言不公开线程,它为您提供 Erlang 进程。这些进程由 Erlang 运行时有效地调度到通常映射到 CPU 内核的 OS 线程上。它们是轻量级的(包括初始堆在内的 32 位 VM 上的内存占用少于 4kb)并且是预先安排的,因此它们中的任何一个中的阻塞或大量 CPU 消耗都不会拒绝任何其他进程公平共享 CPU时间。

因此,不要害怕生成一个进程来处理您要在系统中提供服务的每个请求 - 这是一个很好的初始设计,通常通过并行性为您提供良好的吞吐量,并且往往更容易扩展到更多内核/CPU/节点.

另一个好处是每个进程中的代码都可以以直接的程序方式编写:

%% Ask a server to perform a request and await the response from the worker.
request(Server, R) ->
    Server ! {new_request, R, self()},
    receive {response, Response} -> Response end.

%% Create a server.
start() ->
    spawn(?MODULE, server, []).

%% The server code
server() ->
    receive
        {new_request, R, Sender} ->
            %% Spawn a process to handle this request
            spawn(?MODULE, process_request, [R, Sender]),
        server()
    end.

%% The worker code
process_request(R, Sender) ->
    A = do_io(),
    B = do_cpu_bound_thing(A),
    C = do_io(C),
    Sender ! {response, C}. % Return the response to the sender
    %% Process shuts down cleanly here as there's nothing more to do. 

这里我们有两种进程,一个是接受新请求的中央服务器进程,另一个是实际完成工作的任意数量的工作进程。单个请求中的错误不会影响服务器进程或其他工作进程,单个工作进程可以根据 IO 和 CPU 资源以不同的速率运行。

从这里很容易添加对工作进程的监督,以便我们可以重新启动失败的单个请求,通过在 spawn 调用中添加一个“节点”参数来创建工作线程,超时以便客户端发出请求不会阻塞,多机分布式处理如果服务器过载或工作进程失败,等等。

通过在 gen_event 进程中使用多个处理程序,您无法获得上述代码能够实现的并行性。 gen_event 代码阅读起来会更加复杂,您必须自己交错请求,而不是让运行时为您完成。

tl; dr:开销如此之低,而其他好处如此之大,以至于您通常(几乎总是)应该生成一个进程,而不是尝试在 gen_event 进程中一次执行多项操作。

关于events - erlang 事件与线程相比有多重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7680533/

相关文章:

Erlang badarith 关于 IO 输入

javascript - 将任何 JavaScript 函数转换为页面事件

回调中的 Javascript removeEventListner?

javascript - 使用区域本身上的按钮删除区域

erlang - 修复 erlang 15B Observer(来自 macports);运行失败

erlang 中的映射规范

javascript - 有没有办法检测用户是否在 beforeunload 事件中按下了 "Stay on page"或 "Leave page"?

jquery - 如何重新排序 jQuery 添加的列表项?

c++ - 用另一个函数替换 WndProc 来处理消息?

event-handling - 在Vue组件中监听Electron的ipcRenderer消息