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

h79rfbju  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(123)

我正在使用LuaJIT的ffi调用epoll C库。但是,epoll在没有事件时会阻止,我的软件需要在那个时候执行其他任务。在C中,我知道我可以在单独的线程中执行epoll,但是LuaJIT不是线程安全的。
下面是我的luajit代码:

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

我该如何解决这个问题?
如何使用select或epoll使LuaJIT非阻塞?

mm5n2pyu

mm5n2pyu1#

epoll_wait man page中所述,它的最后一个参数是超时,超时后它将停止阻塞并返回。-1的值--你传入的值--意味着“永远阻塞”,所以你的程序永远阻塞。为了避免阻塞并简单地轮询更新,可以改为传入0,或者传入以毫秒为单位的等待时间。
如果有挂起的任务可以运行,单线程的Java系统通常会轮询事件,如果没有则阻塞。

相关问题