我正在使用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.`
我该如何解决这个问题?
如何使用select或epoll使LuaJIT非阻塞?
1条答案
按热度按时间mm5n2pyu1#
如
epoll_wait
man page中所述,它的最后一个参数是超时,超时后它将停止阻塞并返回。-1
的值--你传入的值--意味着“永远阻塞”,所以你的程序永远阻塞。为了避免阻塞并简单地轮询更新,可以改为传入0
,或者传入以毫秒为单位的等待时间。如果有挂起的任务可以运行,单线程的Java系统通常会轮询事件,如果没有则阻塞。