2014-09-13 68 views
-1

我正在运行一个线程将'数据'放到屏幕上。 线程的要点是阻止这个函数的阻塞,这样我就可以在数据返回的时候向套接字发送数据。红宝石线程仍然阻塞

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没有线程不同。

+0

也许你想要一个Actor模型?有关信息,请参阅http://rubini.us/doc/en/systems/concurrency/或http://celluloid.io/。 – 2014-09-13 15:54:43

回答

2

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 
+0

该函数在类中定义,因此我无法在类之外调用t1.join。我可以发送我的消息,然后收到,但我不能发送任何其他内容。当我发送数据时,我需要持续打印到屏幕上。 – Corrosive 2014-09-13 08:33:16

+0

在这种情况下,如果我不运行t1.join,那么您可能想要尝试省略't1.join' – Reck 2014-09-13 08:52:18

+0

,然后我可以发送,但我仍然无法看到以我的方式返回的内容。所以我仍然有同样的问题。 – Corrosive 2014-09-13 08:53:30

-2

Ruby不提供真正的线程(jruby呢)。 随着一个无限循环,比如在红宝石中使用线程,不会做任何事情,因为循环永远不会结束。

这使得线程永远不会发生,从而阻塞发生。

+0

* Ruby不提供真正的线程(jruby)*不正确。由于Ruby 1.9(YARV,C Ruby)支持本地操作系统线程。这不是原因。这是因为立即调用了'Thread#join',这与绿色/原生线程主题无关。 – 2014-09-13 12:31:55

+1

Ruby线程是复杂的野兽。 GIL的编写方式是,以一个C函数的形式实现的Ruby操作不会对任何Ruby方法进行回调,它总是以原子方式执行。循环构造不满足这个条件。任何不满足此条件的操作都可以停止,另一个线程上的另一个操作可以更改为运行。这意味着尽管你不能有真正的并行线程(即使你有多个处理器),但实际上你可以有多个线程在片中执行它们的操作。 – Reck 2014-09-13 18:57:50