3

我有一个 HTTP 服务器需要处理来自 Lua 代码的 HTTP 请求。从 C 代码中,我以这种方式调用一些 Lua C API(想法来自这里):

lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_loadfile(L, "some.lua");
lua_pcall(L, 0, 0, 0);   /* preload */
lua_getglobal(L, "handle");
lua_pushstring(L, "http_request");
lua_pcall(L, 1, 1, 0);
lua_close(L);

这一堆代码针对每个 HTTP 请求运行。在多线程工作者上下文中,此代码具有相当大的性能成本(从 20000tps 到 100tps)。我想知道有没有更有效的方法从 C 调用 Lua 代码


更新

当我注释掉所有这些 Lua C API 调用时,我可以达到 20000tps。但是当打开这个API调用时,100tps。当在some.lua中进行一些更改(去掉require调用,只加载一个空的 Lua 文件),然后性能就达到了 15000tps 左右。

那么,至少这些 API 调用成本大约 5000tps,如何让这个 API 调用更快呢?

4

1 回答 1

2

每个 Lua 状态使用线程安全队列,并在无限循环中从队列中弹出状态。如果队列为空,则让状态等待插入队列时触发的条件。我建议使用 LuaJIT,因为它将优化原始线程 API 调用以接近 C 速度。

除非您正在处理大量的 HTTP 请求,否则这不会使您受益匪浅(如 dsign 所述)。

注意:这种方法涉及对多个请求重用 Lua 状态。如果这是一个安全问题,您也许可以对每个会话的 Lua 状态执行一些操作,并具有过期超时......但我不确定。(这将是有状态的服务器-客户端伙伴关系的一个有趣的实验!你可以使用 Lua 状态来保持用户的整个会话,然后在有新请求时从睡眠中恢复......这会很快。)

于 2013-06-22T06:31:16.547 回答