gpt4 book ai didi

Ruby 线程不会上下文切换

转载 作者:数据小太阳 更新时间:2023-10-29 08:34:22 26 4
gpt4 key购买 nike

使用 MRI ruby​​ 1.9 我有一些类似的代码

def foo()
puts "in foo"
loop do
puts "in foo loop"
end
end

def bar()
puts "in bar"
start_alsa_listener
end

foo_thread = Thread.new { foo }
bar_thread = Thread.new { bar }
foo_thread.join
bar_thread.join

start_alsa_listener 是一个阻塞库调用,它打开 ALSA midi 音序器并等待其上的输入事件。本质上,我希望我的代码不断地“在 foo 循环中”打印出来,同时能够接收 ALSA midi 事件并将它们也打印到控制台(start_alsa_listener 在接收到事件时执行)。

问题是,当我运行上面的代码时,一旦 bar() 运行,它就不会将上下文切换回 foo()。

start_alsa_listener 是一个 ruby​​ C 扩展,看起来像:

for(;;) {
poll(/* args */); /* wait for input data */
/* print data to console */
}

也许它与 Ruby 中我在线程方面做错了什么有关,或者可能与轮询有关,或者可能与 ALSA 处理线程的方式有关。感谢您的帮助。

最佳答案

如史蒂夫所说,您展示的循环将阻塞整个解释器(假设 poll 正在阻塞)。您需要使用 rb_thread_blocking_region 调用 poll()来自 Ruby (MRI/YARV) C API。

关于Ruby 线程不会上下文切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5805891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com