当Erlang VM梁运行一些用C编写的代码时,没有安排用Erlang编写的其他进程。 例如:
static ERL_NIF_TERM
nifsleep(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
sleep(10);
return enif_make_atom(env, "ok");
}
当你在Erlang中调用这个C函数时,其他进程没有正常进行schedulling。 我想知道为什么? 这是一个功能还是受实现的限制(也就是说,这是一个错误)?
上面代码的地址位于:https://github.com/davisp/sleepy
答案 0 :(得分:6)
beam进程未直接映射到OS线程。每个核心通常有1个调度程序。您致电
睡眠(10);
阻止执行它的调度程序(正如预期的那样,否则它必须以某种方式拦截该调用以使其成为非阻塞),因此调度程序在调用返回之前不能执行任何其他erlang进程。 强烈劝阻长跑nif。一个快速的谷歌足以找到许多参考,例如,参见 http://www.erlang.org/doc/man/erl_nif.html#lengthy_work
http://osdir.com/ml/erlang-questions-programming/2013-02/msg00275.html
http://ninenines.eu/articles/erlang-scalability
有关调度程序如何工作的全面信息,请参阅 http://jlouisramblings.blogspot.com.ar/2013/01/how-erlang-does-scheduling.html