Events erlang事件和线程有多重?

Events erlang事件和线程有多重?,events,event-handling,erlang,Events,Event Handling,Erlang,我不确定这是否明智,但我正在阅读erlang,我正在看gen_事件,我想知道在Node.Js中使用它进行完全面向事件的编程会有什么开销 让事件处理一个任务与在erlang中生成一个新线程来执行同一任务相比,开销是多少 谢谢。Erlang语言不公开线程,它提供Erlang进程。这些进程由Erlang运行时高效地调度到通常映射到CPU内核的OS线程上。它们重量轻(包括初始堆在内,32位虚拟机上的内存占用小于4kb),并且是预先安排的,因此任何一个进程中的阻塞或大量CPU消耗都不会拒绝任何其他进程公平

我不确定这是否明智,但我正在阅读erlang,我正在看gen_事件,我想知道在Node.Js中使用它进行完全面向事件的编程会有什么开销

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


谢谢。

Erlang语言不公开线程,它提供Erlang进程。这些进程由Erlang运行时高效地调度到通常映射到CPU内核的OS线程上。它们重量轻(包括初始堆在内,32位虚拟机上的内存占用小于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调用中添加一个“Node”参数来创建工作进程,从而重新启动失败的单个请求、多机分布式处理、超时,以便在服务器过载或工作进程失败时发出请求的客户端不会永远阻塞,等等

通过在gen_事件进程中使用多个处理程序,无法获得上述代码所能实现的并行性。gen_事件代码的读取将更加复杂,您必须自己交错请求,而不是让运行时为您执行



tl;dr:开销如此之低,其他好处如此之大,以至于您通常(几乎总是)应该创建一个流程,而不是尝试在一个gen_事件流程中同时执行多项任务。

谢谢,这基本上就是总结。