Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby线程仍然阻塞_Ruby_Multithreading - Fatal编程技术网

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方法)将始终以原子方式执行。循环构造不满足此条件。任何不满足此条件的操作都可以停止,并且可以更改另一个线程上的另一个操作以运行。这意味着,虽然您不能拥有真正的并行线程(即使您有多个处理器),但实际上您可以让多个线程在片中执行它们的操作?有关信息,请参阅或。