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
Elixir 进程处于空闲模式_Elixir - Fatal编程技术网

Elixir 进程处于空闲模式

Elixir 进程处于空闲模式,elixir,Elixir,当进程等待接收消息时,它处于空闲状态,不会浪费CPU时间。这是什么意思 我有一个递归的循环函数: def start do spawn(&loop/0) end defp loop do receive do {:run_query, caller, query_def} -> send(caller, {:query_result, run_query(query_def)}) end loop end

当进程等待接收消息时,它处于空闲状态,不会浪费CPU时间。这是什么意思

我有一个递归的
循环
函数:

def start do
    spawn(&loop/0)
end

defp loop do
    receive do
        {:run_query, caller, query_def} ->
            send(caller, {:query_result, run_query(query_def)})
    end

    loop
end 

CPU总是忙于上面的进程,还是它允许其他进程执行它们的任务?

这很容易测试,我在笔记本电脑上启动了(类似的)代码,并用ps观察了这个进程:

$ ps -o %cpu,comm
 %CPU COMM
  0.0 /opt/boxen/homebrew/Cellar/erlang/18.0.3/lib/erlang/erts-7.0.3/bin/beam.smp

Beam会将进程置于睡眠状态(不要将进程与操作系统进程混淆,这是不同的事情),并且只有在收到消息时才会唤醒进程。

这是一个微不足道的测试,我在笔记本电脑上启动了(类似)代码,并用ps观察了进程:

$ ps -o %cpu,comm
 %CPU COMM
  0.0 /opt/boxen/homebrew/Cellar/erlang/18.0.3/lib/erlang/erts-7.0.3/bin/beam.smp

Beam会将进程置于睡眠状态(不要将进程与操作系统进程混淆,它们是不同的东西)只有在收到消息时才会被唤醒。

产生新进程时基本上会发生什么情况VM将创建新的Erlang进程并将其推入队列,调度器将运行该进程,但如果其中一个进程未接收到任何消息或未进行任何计算,则其处于空闲状态意味着它将无法使用cpu,而只能使用进程仍然消耗内存,一个给定的进程可能有几种状态,甚至有休眠模式,在这种情况下,进程处于休眠模式,VM将收回资源,并在出现该进程的消息时唤醒该进程。

当您生成新进程时,基本上会发生什么情况VM将创建新的Erlang进程并将其推到队列中调度程序将运行该进程,但如果其中一个进程未接收任何消息或未执行任何计算,则其处于空闲状态意味着它将无法使用cpu获得任何时间,但该进程仍会消耗内存,一个给定的进程可能有几种状态,甚至有休眠模式,在这种情况下,进程处于休眠模式,VM将收回资源,并在出现该进程的消息时唤醒进程。

睡眠是什么意思,进程将保存到内存中,直到有调用为止?换句话说,它不会占用不必要的CPU周期,并允许其他Erlang进程运行。虚拟机足够聪明,不会在没有做任何事情的进程上浪费时间。因此,当Erlang虚拟机计划生成新进程时,该进程会有一个小的时间窗口来执行,或者它是如何工作的?“执行会暂停,可能是无限期的,直到一条消息到达,该消息与其中一个模式匹配,并且具有真正的保护序列。”这可能是使用或类似的方法实现的。它意味着睡眠,进程将保存到内存中,直到有调用为止。换句话说,它不会占用不必要的CPU周期,并允许其他Erlang进程运行。虚拟机足够聪明,不会在没有做任何事情的进程上浪费时间。因此,当Erlang虚拟机计划生成新进程时,该进程会有一个小的时间窗口来执行,或者它是如何工作的?“执行会暂停,可能是无限期的,直到一条消息到达,该消息与其中一个模式匹配,并且具有真正的保护序列。”这可能是使用或类似的方法实现的