提问人:tvon 提问时间:7/27/2023 更新时间:9/8/2023 访问量:48
如何使 LuaJIT 不阻塞 select 或 epoll?
How can I make LuaJIT non-blocking with select or epoll?
问:
我正在使用 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?
答:
1赞
Colonel Thirty Two
9/8/2023
#1
如epoll_wait
手册页中所述,它的最后一个参数是超时,之后它将停止阻塞并返回。值 - 您传入的值 - 表示“永远阻止”,因此您的程序会永远阻止。若要避免阻塞并简单地轮询更新,请改为传入,或传入以毫秒为单位的等待时间。-1
0
如果存在可以运行的待处理任务,单线程异步系统通常会轮询事件,如果没有,则会阻止事件。
评论