On Mon, Mar 19, 2012 at 10:42 AM, 文龙 马
<kama6250046@yahoo.com.cn> wrote:
而我要做的是最前端的模板开始,类似facebook的bigpipe的技术。 有一个首屏的概念,然后首屏之后,N个后面的服务相继返回对应的pagelets的服务。
可能是我没理解本质, 呵呵。 不知道lua可以这样吗:(1)解析一个模板得到可以并发的子查询(2)先flush首屏(3)再依次返回各个pagelet的数据。
|
目前,ngx_lua 模块还不能实现严格的 BigPipe 模型,这依赖于即将实现的 ngx.thread 轻量级线程 API,例如下面是这样一个例子:
local thread = require "ngx.thread"
function query_mysql1()
-- use lua-resty-mysql as usual
-- to access mysql server A
ngx.print(result)
end
function query_mysql2()
-- use lua-resty-mysql as usual
-- to access mysql server B
ngx.print(result)
end
local t1 = thread.create(query_mysql1)
local t2 = thread.create(query_mysql2)
thread.waitall({t1, t2})
这里,创建了两个轻量级线程,入口分别是 Lua 函数 query_mysql1 和 query_mysql2. 它们都分别访问某个 mysql 后端,然后输出相应的页面区域(或者说 pagelet)数据。因为这两个线程是异步并发执行的,所以先完成后端查询的线程会先向下游(即 http 客户端)输出自己的数据。
你说的“首屏”数据可以在创建这两个轻量级用户线程的 Lua 代码之前输出。
当然,这里的“轻量级线程”,本质上还是会基于 Lua coroutine 来实现,并不会涉及操作系统线程。
Best,
-agentzh