Erlang VM(BEAM)最吸引人的特性之一就是它执行代码的方式。Erlang中的所有工作都是在Erlang进程中完成的(不要与OS进程混淆)。它们的设计非常轻巧,这意味着可以同时运行数百万个它们。如果要在Erlang中编写Web应用程序,则可以为每个传入请求启动一个新进程。
这种方式和它一样有效的原因是因为BEAM计划执行不同进程的方式。BEAM确保单个进程在撞到运行队列的后面之前不会运行超过指定的时间,并且允许其他进程运行。对于您的Web应用程序,这意味着一个(或一百个)行为不当的请求不会破坏您的其他请求的延迟和体验。
NIF代表Native Implemented Function,是BEAM提供的用于运行本机代码作为Erlang应用程序一部分的机制之一。NIF方法涉及在C中编写共享库,它导出可以加载到BEAM并被调用的函数。
NIF通常用于通过下拉到本机代码来加速计算,以及将低级库中的有用功能暴露给Erlang。
NIF的一个重要提示是它们与Erlang调度程序在同一个线程中运行。由于Erlang调度程序的调整非常精细,因此它们不会被设计为长时间被阻止。这意味着阻塞超过大约一毫秒的NIF将开始对整个VM的性能,稳定性和延迟产生负面影响。
如果想要仍在同一个线程上运行时并透明地执行本机代码,需要怎么做?需要的是满足这两个条件:
可能解决问题的方法: