elua实现Lua NIF异步执行,提升调度器效率

需积分: 9 0 下载量 60 浏览量 更新于2024-10-29 收藏 1.18MB ZIP 举报
资源摘要信息:"elua:lua nif" ### 知识点概述 本文档介绍了一个使用Lua语言编写的NIF(Native Implemented Function)库,命名为`elua_block`,它具有同步与异步执行代码的能力,并且特别关注了在使用这些NIFs时对Erlang调度器的影响。通过执行长时间运行的任务,展示了同步与异步NIFs的行为差异以及它们如何影响调度器的运行。 ### 标题解析 - **标题**:"elua:lua nif" 标题指出这是一个与Lua语言和NIF技术相关的项目,其中`elua`可能表示这是一个与嵌入式Lua相关的实现或扩展,而`nif`是Erlang Native Implemented Function的缩写,指的是在Erlang虚拟机外部实现的函数,它们可以被Erlang代码调用,提供比Erlang内部函数更高的性能。 ### 描述解析 - **描述**: "一个普通的如果执行的时间太长会阻塞调度器。" 描述的开篇即说明了,如果NIF的执行时间过长,它们会对Erlang的调度器造成阻塞。在Erlang中,调度器负责进程和线程的分配,保证高并发的执行,如果被阻塞,则会损害系统的性能和响应性。 - **描述**: "rebar compile -> 编译 erl -pa ebin +P 120000 -> 进入shell." 这部分描述了如何编译和运行项目代码。`rebar compile`是使用Rebar工具来编译项目的命令,这是一个在Erlang社区中常用的构建工具。`erl -pa ebin +P 120000`命令则是启动Erlang shell的命令,`-pa ebin`指定了Erlang代码的搜索路径,`+P 120000`则是修改了进程的最大数量限制为120000,这通常是为了允许创建大量的并发进程。 - **描述**: "同步和异步nif的时间对调度器的阻塞" 描述继续强调同步和异步NIFs在执行时对Erlang调度器的潜在影响。同步NIFs如果执行时间过长,会直接阻塞Erlang调度器,而异步NIFs则不会,它们在后台的线程池中运行,不会直接影响主调度器。 - **描述**: "执行cpu数量个进程,每个进程call到lua sleep 2s." 在接下来的描述中,提出了一个具体的实验场景,即创建与CPU数量相同的进程,每个进程都会调用Lua代码,使其休眠2秒。这个操作的目的是为了观察同步和异步NIFs在实际操作中的行为。 - **描述**: "同步nif:所有的lua代码都执行在调度器上直接阻塞调度器,block的时候无法输出tick." 描述继续对同步NIF的行为进行说明,它们会在Erlang的调度器线程上执行所有Lua代码。如果执行时间过长,会导致调度器线程阻塞,无法进行其他操作,例如输出心跳信号(tick)。 - **描述**: "elua_block:sync().异步nif:所有的lua代码都在单独的线程池中执行,执行完了后返回结构。调度器安全,一切正常。elua_block:async()." 描述介绍了如何通过调用`elua_block:sync().`和`elua_block:async().`来分别执行同步和异步NIFs。异步NIFs允许Lua代码在独立的线程池中执行,完成后返回结果,这样就保证了调度器的安全性和正常运作。 - **描述**: "直接给出结论:本仓库已经实现了完整的异步线程池来在lua_state中执行代码。已经经过比较充分的测试,目前看无bug,代码简单易读,容易移植。每个发给lua_state的消息顺序保证不会乱,看了实现你就知道了。异步nif只是比同步nif更安全,不会阻塞er" 最后,文档给出了一个结论,即项目已经实现了一个完整的异步线程池来执行Lua代码,并且经过充分的测试,目前没有发现bug。代码被设计成简单易读,且容易移植到其他环境中。此外,通过实现保证了消息的顺序性,这是异步编程中非常重要的一个特性。异步NIFs的使用比同步NIFs更安全,因为它们不会阻塞Erlang的调度器。 ### 标签解析 - **标签**: "C" 标签"C"表明该库的底层实现可能是使用C语言编写的,因为NIFs需要被嵌入到Erlang虚拟机中,并且通常是用C或者C++这类系统编程语言来实现,它们可以提供对硬件和操作系统的低级访问。 ### 压缩包子文件的文件名称列表 - **elua-master** 这是项目源代码压缩包的名称,表明了这个项目是一个名为`elua`的主项目源代码,而`master`通常指代主分支或主版本。用户下载这个文件后,可以通过解压缩来获取项目的源代码。 ### 结语 综上所述,文档详细描述了一个基于Lua的异步NIF实现,其重点关注于如何在不阻塞Erlang调度器的情况下执行长时间运行的任务。文档中还提供了实际的测试案例,并且表明了代码的稳定性、可读性和可移植性。这对于需要在Erlang环境中运行高性能任务的开发者来说是一个有价值的资源。