Ruby线程仍然阻塞
我正在运行一个线程将“数据”放到屏幕上。 线程的目的是停止对这个函数的阻塞,这样我就可以将数据发送到套接字,同时监听返回的数据Ruby线程仍然阻塞,ruby,multithreading,Ruby,Multithreading,我正在运行一个线程将“数据”放到屏幕上。 线程的目的是停止对这个函数的阻塞,这样我就可以将数据发送到套接字,同时监听返回的数据 def msg_loop() t1 = Thread.new{ loop do msg = @socket.recv(30) self.msg_dis(msg) end } t1.join end 但是如果我跑 myclass.ms
def msg_loop()
t1 = Thread.new{
loop do
msg = @socket.recv(30)
self.msg_dis(msg)
end
}
t1.join
end
但是如果我跑
myclass.msg_loop
myclass.send_msg("message to send")
函数send_msg从不运行,与msg_loop没有线程时没有区别。
t1.join
使程序等待线程t1完成运行。你想这样做
def msg_loop()
t1 = Thread.new{
loop do
msg = @socket.recv(30)
self.msg_dis(msg)
end
}
t1
end
t1 = myclass.msg_loop
myclass.send_msg("message to send")
t1.join
Ruby不提供真正的线程(jruby提供)。 使用无限循环(如我的),ruby中的线程不会做任何事情,因为循环永远不会结束
这会导致线程从不执行,从而发生阻塞。函数是在类中定义的,因此我无法在类外调用t1.join。我可以发送我的消息,然后接收,但我不能发送任何其他东西。当我发送数据时,我需要在屏幕上不断打印。在这种情况下,您可能想尝试忽略
t1.join
如果我不运行t1.join,那么我可以发送,但我仍然看不到返回的方式。所以我仍然有同样的问题。Ruby不提供真正的线程(jruby提供)不正确。由于Ruby1.9(YARV,cRuby)支持本机操作系统线程。这不是原因。这是因为立即调用了Thread#join
,这与绿色/本机线程主题无关。Ruby线程是复杂的野兽。GIL的编写方式是,作为C函数实现的Ruby操作(不回调任何Ruby方法)将始终以原子方式执行。循环构造不满足此条件。任何不满足此条件的操作都可以停止,并且可以更改另一个线程上的另一个操作以运行。这意味着,虽然您不能拥有真正的并行线程(即使您有多个处理器),但实际上您可以让多个线程在片中执行它们的操作?有关信息,请参阅或。