代码之家  ›  专栏  ›  技术社区  ›  tvon

如何使用select或epoll使LuaJIT不阻塞?

  •  0
  • tvon  · 技术社区  · 3 年前

    我正在使用LuaJIT的ffi来调用epollC库。然而,当没有事件时,epoll会阻塞,并且我的软件需要在那个时候执行其他任务。在C中,我知道我可以在一个单独的线程中执行epoll,但LuaJIT不是线程安全的。

    这是我的luajit代码:

      local ctx = ffi.new_tcp("0.0.0.0", 5555)
      local server_socket = ffi.tcp_listen(ctx)
      local epoll_fd = ffi.C.epoll_create1(0)
      --.....
      --.....
      local nfds = ffi.C.epoll_wait(epoll_fd, events, NB_CONNECTION, -1)
    -- This is where it gets blocked and cannot execute other tasks.`
    

    我该如何解决这个问题?

    如何使用select或epoll使LuaJIT不阻塞?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Colonel Thirty Two    3 年前

    如中所述 epoll_wait man page ,它的最后一个参数是超时,之后它将停止阻塞并返回。的值 -1 -你传递的值-意味着“永远阻止”,所以你的程序永远阻止。为了避免阻塞和简单地轮询更新,请传入 0 或者以毫秒为单位等待一段时间。

    如果存在可以运行的挂起任务,单线程异步系统通常会轮询事件,如果没有,则会阻止。