如何将Crystal中X11的阻塞next_event调用改为异步执行?
关于Crystal中X11绑定阻塞调用的并发问题解决思路
我正在使用Crystal的X11绑定库,典型用法如下:
loop do event = display.next_event # <- 阻塞调用! # 处理event逻辑 end
这段代码能正常运行,但next_event是原生C实现的阻塞调用,不会主动让出执行权,导致程序无法并行处理其他任务。
Xlib的NextEvent本身在C语言里就是阻塞的,相关讨论提到过轮询的替代方案,但轮询不仅比next_event慢,还会占用更高CPU,所以我希望保留这个阻塞调用。
我想知道:是否必须把这个调用放到独立的OS线程里?-Dpreview_mt标志可以解决问题,但它是实验性的,而且我之前误以为开启后所有并发都基于线程(后来发现有spawn same_thread: true do语法)。除此之外我还有哪些可选方案?
编辑补充:
- 这个问题在Crystal社区论坛的相关讨论中有更详细的探讨,值得参考。
- 如果能获取到对应的文件描述符,使用
FileDescriptor的wait_readable方法也可以解决该问题。
内容的提问来源于stack exchange,提问作者phil294
相关产品推荐
相关产品推荐

