Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成新进程是否使用elixir中的所有CPU核_Elixir - Fatal编程技术网

生成新进程是否使用elixir中的所有CPU核

生成新进程是否使用elixir中的所有CPU核,elixir,Elixir,假设我在一台4核CPU机器上 如果我在elixir VM中运行以下操作: 1..4 |> Enum.map fn(x) -> spawn(computationally_heavy_process) end 这是否使用了我机器的全部4个内核。每个计算繁重的进程中都有一个?elixir虚拟机就是Erlang虚拟机,它调度生成的进程如何分配给机器CPU。你没有直接的控制权。但是,在运行自己的代码之前,通过发出:observer.start(),您可以使用图表的可视化来查看4个调度程序

假设我在一台4核CPU机器上

如果我在elixir VM中运行以下操作:

 1..4 |> Enum.map fn(x) -> spawn(computationally_heavy_process) end

这是否使用了我机器的全部4个内核。每个计算繁重的进程中都有一个?

elixir虚拟机就是Erlang虚拟机,它调度生成的进程如何分配给机器CPU。你没有直接的控制权。但是,在运行自己的代码之前,通过发出
:observer.start()
,您可以使用图表的可视化来查看4个调度程序在VM中的使用情况。我发现它似乎做得很合理。为了进行真实性检查,您还可以在linux操作系统上运行
top
。这可以显示每个cpu的实际使用量-尝试在同一台机器上的不同控制台上按1

是的。默认情况下,Erlang为每个CPU启动一个调度程序(OS线程),并尝试在调度程序之间均匀分配负载。但是,不能保证这四个进程最终会在四个不同的CPU中处理,因为通常会有更多的事情并行发生。如果您想知道Erlang已经启动了多少个调度程序,只需启动
iex
(或者
erl

例如,我的电脑有一个8核的CPU。在输出的第一行中,您可以看到当前配置。从部分
[smp:8:8]
中,您可以看到它配置了8个调度程序,其中8个是在线的。可以使用覆盖调度程序/线程的数量

+S调度器:SchedulerOnline

设置要创建的计划程序线程数和计划程序线程数 在启用SMP支持时设置为联机。两者的最大值 值为1024。如果Erlang运行时系统能够确定 配置的逻辑处理器数量和逻辑处理器数量 可用,调度程序将默认为配置的逻辑处理器, SchedulerOnline将默认为可用的逻辑处理器; 否则,默认值将为1。[……]


在线调度程序的数量也可以在运行时通过更改。但是,我建议不要更改任何默认设置,除非您遇到特定问题。

Erlang和OTP在第一章中非常好地介绍了这方面的基础知识。编辑了我的答案,以提供有关如何内省当前计划程序配置的更多详细信息,以及指向Erlang文档的链接。
~$ iex
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
...