我正在将一个简单的窗口库实现为 Ruby C 扩展。 Windows 有一个进入其 native 事件循环的 handle_events!
方法。
问题是我希望每个窗口和方法 block 有一个事件循环。我希望该方法立即返回并让循环在单独的线程中运行。实现这一目标的最佳方法是什么?
我尝试使用 rb_thread_call_without_gvl
调用事件循环函数,然后使用 rb_thread_call_with_gvl
调用窗口的回调,即 Proc
秒。可以找到完整的源代码 here .
它仍然有效,但不像我预期的那样:该方法仍然阻塞。这甚至可以用 Ruby 的线程模型实现吗?
最佳答案
我有同样的问题要解决。由于 rb_thread_call_with_gvl() 在 1.9.2 中被标记为实验性的并且它不是导出的符号,我采用了不同的方法:
我调用了阻塞的 handle_event!从一个单独的线程运行。我使用了第二个 ruby 线程,它阻塞在消息队列上。在消息队列上阻塞时,gvl 被 rb_thread_blocking_region() 释放。
如果现在线程调用handle_event!由于事件而被解除阻塞,它将 Proc 的上行调用所需的所有信息拉到一个队列元素中,并将该元素插入队列。 ruby 线程接收到从 rb_thread_blocking_region() 返回的元素,因此重新获取 gvl 并使用接收到的元素的信息调用 Proc。
亲切的问候 托尔斯滕
关于c - ruby C 扩展 : run an event loop concurrently,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7892258/