处于空闲模式

时间:2016-03-04 21:15:12

标签: elixir

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

我有一个递归loop函数:

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是否总是忙于上述过程,还是允许其他进程执行其任务?

2 个答案:

答案 0 :(得分:3)

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

SELECT  COUNT(*) AS "__count"
FROM    "udjango_blog"
WHERE   "udjango_blog"."id" IN
        (
        SELECT  U0."blog_id"
        FROM    "udjango_entry" U0
        WHERE   U0."headline" LIKE '%Hello%' ESCAPE '\'
        )

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

答案 1 :(得分:1)

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