LuaNode: Asynchronous I/O for Lua

1,720 views
1,519 views

Published on

This is the talk about LuaNode that was presented at the Lua Workshop 2013 [1].

The source code for the demo is available on Github [2].

LuaNode allows to write performant net servers or clients in Lua.


[1]: http://www.lua.org/wshop13.html
[2]: https://github.com/ignacio/lua_workshop_2013

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,720
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
13
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

LuaNode: Asynchronous I/O for Lua

  1. 1. LuaNode Asynchronous I/O in Lua Ignacio Burgueño
  2. 2. About Me Ignacio Burgueño Software Developer at inConcert @iburgueno https://github.com/ignacio
  3. 3. Agenda ● What is Asynchronous I/O? ● What is LuaNode? ● Demo ● Guidelines ● Future Improvements
  4. 4. What does Asynchronous I/O mean?
  5. 5. Asynchronous I/O It is not only: ● Nonblocking operations
  6. 6. Asynchronous I/O It is not only: ● Nonblocking operations ● Readyness
  7. 7. Asynchronous I/O It is not only: ● Nonblocking operations ● Readyness It is: ● Notification on operation completion
  8. 8. What is LuaNode?
  9. 9. What is LuaNode? ● ● ● Event driven, asynchronous IO model. (Like Node.js, nginx) Runs Lua code (5.1.5) Similar to Node.js, EventMachine (Ruby), Twisted (Python) https://github.com/ignacio/luanode
  10. 10. What is LuaNode? JavaScript (v8) + C++ + libuv = Node.js Lua + C++ + Boost::ASIO = LuaNode
  11. 11. Application Code (Lua) Lua C++ Boost::Asio Kernel
  12. 12. Supported platforms ● Windows (7, 8) ● Linux ● OSX
  13. 13. A taste of LuaNode local function handle_request (server, request, response) response:writeHead(200, {["Content-Type"] = "text/plain"}) response:finish("Hello World!")) end luanode.http.createServer(handle_request):listen(8124) console.log("Server running at http://127.0.0.1:8124/") process:loop()
  14. 14. An example of synchronous IO local socket = require "socket" local function get (host, file) local c = assert(socket.connect(host, 80)) c:send("GET " .. file .. " HTTP/1.0rnrn") local s = c:receive("*a") print("Received ".. #s .. " bytes.") c:close() end local host = "www.w3.org" get(host,"/TR/2002/REC-xhtml1-20020801/xhtml1.pdf") get(host,"/TR/REC-html32.html")
  15. 15. Asynchronous I/O example local function get (host, file) local c, l = luanode.net.createConnection(80, host), 0 c:on("connect", function() c:on("data", function(self, data) l = l + #data end) c:on("close", function() console.log("Downloaded file '%s'. Received %d bytes.", file, l) end) c:write("GET " .. file .. " HTTP/1.0rnrn") end) end get("www.w3.org","/TR/2002/REC-xhtml1-20020801/xhtml1.pdf") get("www.w3.org","/TR/REC-html32.html") process:loop()
  16. 16. The Loop ● Provided by ASIO ● Handles a queue ● Completed operations are posted there ● Dispatch associated callbacks
  17. 17. Not only IO Timers setTimeout(function() console.log("5 seconds have passed") end, 5000)
  18. 18. Not only IO Timers setInterval(function() console.log("5 seconds have passed") end, 5000)
  19. 19. Not only IO DNS luanode.dns.lookup("www.google.com", function(ok, addrs, hostname) console.log(luanode.utils.inspect(addrs)) end) { family => 4, port => 0, address => "200.40.0.90"}
  20. 20. Not only IO TTY require "luanode.tty" local stdin = luanode.tty.ReadStream(Stdio.stdinFD) stdin:on("data", function(self, data) console.log("data:", data) end) stdin:resume() process:loop()
  21. 21. Demo time!
  22. 22. Server sent events ● ● Browser issue two requests that become a persistent one way connection The server pushes data to the browser from time to time
  23. 23. Guidelines ● Stay close to Node.js ● Similar API ● Easy to adapt existing libraries
  24. 24. What is available today? ● TCP ● HTTP ● HTTPS ● TIMERS ● TTY ● REPL
  25. 25. When to use? ● Stuff that is IO bound. ● Simple webservers. ● Test servers. ● Mock services. ● Exploratory programming (REPL) ● Load testing.
  26. 26. When not to use? ● ● Currently, with stuff that is CPU Bound (Don't write servers to compute Fibonacci numbers with it)
  27. 27. Some available modules ● Redis (redis-luanode) ● Socket.IO (LuaNode-Socket.IO) ● OAuth (LuaOAuth) ● Route66 (simple url routing, inspired by Orbit)
  28. 28. Existing users (other than me :) Moonwalk: a Swagger server implementation for Lua. https://github.com/abadc0de/moonwalk Xauxi: A reverse proxy http://ia97lies.github.io/xauxi/
  29. 29. Callback hell Possible solutions? ● Coroutines ● Futures
  30. 30. Coroutines IssueHttpRequest(function(response) -- deal with response IssueDBQuery(function(result) -- deal with result setTimeout(function() -- and we are done end, 5000) end) end)
  31. 31. Coroutines -- makes a fake synchronous function Sync(function(wait, yield) IssueHttpRequest(wait) local _, response = yield() -- deal with response IssueDBQuery(wait) local result = yield() -- deal with result setTimeout(wait, 5000) yield() -- wait five seconds --and we are done end) -- end Sync function
  32. 32. Coroutines local function Sync(fn) local function make_resumer(co) return function(...) return assert(coroutine.resume(co, ...)) end end local co = coroutine.create(fn) assert( coroutine.resume(co, make_resumer(co), coroutine.yield ) ) end
  33. 33. Future improvements
  34. 34. Future improvements ● Documentation ● Migrate to libuv ● Better multicore support. ● Proper File I/O ● UDP support ● Better coroutine integration ● Multithreading
  35. 35. LuaNode makes writing async code easy.
  36. 36. Questions?
  37. 37. Thanks! Ignacio Burgueño - @iburgueno

×