如何使 LuaJIT 不阻塞 select 或 epoll?

How can I make LuaJIT non-blocking with select or epoll?

提问人:tvon 提问时间:7/27/2023 更新时间:9/8/2023 访问量:48

问:

我正在使用 LuaJIT 的 ffi 来调用 epoll C 库。但是,当没有事件时,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.`

我该如何解决这个问题?

如何使 LuaJIT 不阻塞 select 或 epoll?

C ·埃波尔 卢阿吉特

评论

0赞 ESkri 7/27/2023
您可以创建第二个线程,并在其中运行单独的 LuaJIT VM。

答:

1赞 Colonel Thirty Two 9/8/2023 #1

epoll_wait手册页中所述,它的最后一个参数是超时,之后它将停止阻塞并返回。值 - 您传入的值 - 表示“永远阻止”,因此您的程序会永远阻止。若要避免阻塞并简单地轮询更新,请改为传入,或传入以毫秒为单位的等待时间。-10

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