Ruby:运行多个线程的问题?

时间:2013-04-19 04:37:24

标签: ruby-on-rails ruby ruby-on-rails-3 multithreading thread-safety

运行多个线程有什么问题吗?

当我使用action1加载页面时,它可以工作。

的HomeController

def action1
    threads = []
    threads << Thread.new {@lub = client.tag_recent_media('tag1')}
    Thread.new{@tags = client.tag_recent_media('encorebeach')}
    Thread.new{@location = client.location_recent_media('16565')}

    threads.each(&:join)  
end

主页视图

<% (@lub+@tags+@location).each do |media| %>
<%= media %>
<% end %>

这是另一个具有不同视图的控制器

AnotherController

def action1
    threads2 = []
    threads2 << Thread.new {@lub2 = client.tag_recent_media('tag1')}
    Thread.new{@tags2 = client.tag_recent_media('encorebeach')}
    Thread.new{@location2 = client.location_recent_media('16565')}

    threads2.each(&:join)  
end

另一种观点

<% (@lub2+@tags2+@location2).each do |media| %>
<%= media %>
<% end %>

对于第二个输出,我收到错误

undefined method `+' for nil:NilClass

我认为线程有问题。有人可以帮我解释为什么会这样吗?是因为我已经在主页中执行了一个线程,然后当我想要转到另一个页面时,它再次运行一个线程并且它不会工作?

谢谢!

1 个答案:

答案 0 :(得分:2)

threads仅包含您的第一个帖子。幸运的是,在视图中使用实例变量之前,第一个方法的线程已完成。

threads = []
threads << Thread.new {@lub = client.tag_recent_media('tag1')}
threads << Thread.new{@tags = client.tag_recent_media('encorebeach')}
threads << Thread.new{@location = client.location_recent_media('16565')}

甚至更简单:

threads = [
  Thread.new{@lub = client.tag_recent_media('tag1')},
  Thread.new{@tags = client.tag_recent_media('encorebeach')},
  Thread.new{@location = client.location_recent_media('16565')}
]

将完成你想要的。

与仅在控制器线程中运行它们相比,很可能不会从中获得太多性能。您甚至可能会破坏数据库服务器,而不是将其放慢速度。测量线程是否为您带来任何性能,并记住使用线程时存在许多陷阱。