ngx_lua模块
Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的是用C开发模块必须要熟悉Nginx源码,使得开发者对其望而生畏。
ngx_lua模块通过将lua解释器集成进Nginx,可以采用lua脚本实现业务逻辑。
该模块具备以下特性:
1 高并发、非阻塞的处理各种请求
2 Lua内建协程,这样就可以很好的将异步回调转换成顺序调用的形式。
3 每个协程都有一个独立的全局环境(变量空间),继承于全局共享的、只读的“comman data”
得益于Lua协程的支持,ngx_lua在处理1万个并发请求时只需要很少的内存。根据测试ngx_lua处理每个请求只需要2KB的内存,如果使用LuaJIT则会更少。
ngx_lua非常适合用于实现可扩展的、高并发的服务。
协程(Coroutine)
协程类似一种多线程,与多线程的区别有:
- 协程并非os线程,所以创建、切换开销比线程相对要小
- 协程与线程一样有自已的栈、局部变量等,但是协程的栈是在用户进程空间模拟的,所以创建、切换开销很小。
- 多线程程序是多个线程并发执行,也就是说在一瞬间有多个控制流在执行。而协程强调的是一种多个协程间协作的关系,只有当一个协程主动放弃执行权,另一个协程才能获得执行权,所以在某一瞬间,多个协程间只有一个在运行。
- 由于多个协程时只有一个在运行,所以对于临界区的访问不需要加锁,而多线程的情况则必须加锁。
- 多线程程序由于有多个控制流,所以程序的行为不可控,而多个协程的执行是由开发者定义的