当进程正在等待接收消息时,它处于空闲状态并且不会浪费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是否总是忙于上述过程,还是允许其他进程执行其任务?
答案 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将声明资源返回并将一旦有给定流程的消息,就唤醒流程。