@G_will 谢谢:
刚才查看了一下io多路复用, 在nginx里差不多就体现在epoll这样的系统调用, 而这个是相对于nginx对请求处理的切换的,也可以说nginx主动的避免了阻塞io的使用.
而实质上一个worker同一时刻只处理一个请求, 还是上面的例子, 当这个请求中Lua的操作是阻塞的(比如io.read), 无论这个时间段有多小(协程想主动交出控制权还是需要在此之后), 它在这一点时间里确实是阻塞的, 那么线程就停了(无从切换到其它请求). 问题就是怎么解决这个问题?
当然了, 任何操作都需要时间, 也许上面的例子并不是很恰当, 想要的理想情况: 有没有这样一条路, 所有的IO操作都可以是"非阻塞"的, 或者说nginx_lua是否有这样的机制还是需要自己去实现所有的非阻塞库? 或者根本就没有必要?
上面有的确定的语气是为了描述问题, 不等于我说的是对的 ;-)
在 2013年4月13日星期六UTC+8下午12时25分54秒,G_will写道:
在 2013年4月13日上午11:39,Guichao Cai
<r...@v2u.org>写道:
在我的理解里, nginx同时只能处理一个请求, 而实现并发是因为在遭遇需要等待的事件时, 转而去处理其它请求.
我的理解是 Nginx 的非阻塞并不是简单的在等待时处理其他任务那么简单,而是实现了多路 IO 复用。
如果以上理解还算正确的话, 那么在一个lua程序中要做一个耗时的操作, 比如大文本的处理, 这时需要怎么做才能不阻塞整个线程?
使用 Lua 中的协程,思路是在处理读取时一次读一部分(视处理需要而定),然后 yield 出控制权,处理完后再继续读取。事实上,在整个过程中,读取整个的文本的 IO 时间并没有真正减少,只是利用协程将程序逻辑运算时间和 IO 并行起来,进而提高整体效率。
--
sp;