gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:29:13 26 4
gpt4 key购买 nike

不确定这是否可取,但我正在阅读 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com