Skip to content

Libuv event loop #2396

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
PerilousApricot opened this issue Feb 19, 2025 · 4 comments
Open

Libuv event loop #2396

PerilousApricot opened this issue Feb 19, 2025 · 4 comments

Comments

@PerilousApricot
Copy link

I'm wondering if there is a way to use libuv in the background. I've tried the following in init_worker_by_file, and it appears that while the timers fire and the thread is started, subsequent requests never get control:

local uv = require('luv')
local ngx = require('ngx')
print("Initializing worker (hopefully)")
local function my_loop_init_timer(premature)
  -- This timer is run in init context and (hopefully) will let us start a
  -- light thread in the worker context
  local function my_loop_thread()
    -- this hopefully persists for the lifetime of the worker
    print("UV thread executing, uv FD is: " .. uv.backend_fd())
    while ngx.worker.exiting() == false do
      -- I know this is busy waiting, but I don't know another way to tell lua-nginx to poll the fd
      while uv.run("nowait") do
        coroutine.yield()
      end
      coroutine.yield()
      uv.sleep(1)
    end
  end
  ngx.thread.spawn(my_loop_thread)
end
print("Main interpreter is running, uv FD is: " .. uv.backend_fd())

ngx.timer.at(0, my_loop_init_timer)
@DuskRavenVII
Copy link

Try using uv.run(), it might solve your problem.

@PerilousApricot
Copy link
Author

Hi @DuskRavenVII I'd hope it would, but it either blocks (uv.run()) or returns possibly before the I/O is complete (uv.run("nowait")), I'm looking for a way to get the event loop running asynchronously/in the background, and I'm missing how to do that within openresty

@PerilousApricot
Copy link
Author

I'd like to replace what is primarily a file i/o HTTP interface (with some extra parts, which is why the regular sendfile() and friends functionality doesn't work), but it appears there's no non-blocking file i/o within either lua itself, or in lua-nginx-module, which is what led me down the path of attempting to use libuv. Is this a pattern you've seen before?

@DuskRavenVII
Copy link

Use uv.run() in a separate thread and make sure that uv.run("nowait") is continuously checking for I/O operations.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants