英文:
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)
-- 在这里会被阻塞,无法执行其他任务。
我该如何解决这个问题?
我该如何使用select或epoll使LuaJIT非阻塞?
英文:
I'm using LuaJIT's ffi to call the epoll C library. However, epoll blocks when there are no events, and my software needs to perform other tasks at that time. In C, I know I can execute epoll in a separate thread, but LuaJIT is not thread-safe.
Here's my luajit code:
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.`
How can I solve this problem?
How can I make LuaJIT non-blocking with select or epoll?
答案1
得分: 1
根据epoll_wait
man页面的文档,它的最后一个参数是一个超时时间,在此时间之后,它将停止阻塞并返回。传入的值为-1
,即你传入的值,意味着“永久阻塞”,因此你的程序将永远阻塞。为了避免阻塞并简单地轮询更新,请传入0
,或者传入一个以毫秒为单位的等待时间。
单线程的异步系统通常会在有待处理任务时轮询事件,如果没有任务,则会阻塞。
英文:
As documented in the epoll_wait
man page, the last argument to it is a timeout, after which it will stop blocking and return. A value of -1
- the value you pass in - means "block forever", so your program blocks forever. To avoid blocking and simply poll for updates, pass in 0
instead, or pass in an amount of time in milliseconds to wait.
Single-threaded async systems usually will poll for events if there are pending tasks that it could be running instead and block if there aren't.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论