运行多个线程有什么问题吗?
当我使用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
我认为线程有问题。有人可以帮我解释为什么会这样吗?是因为我已经在主页中执行了一个线程,然后当我想要转到另一个页面时,它再次运行一个线程并且它不会工作?
谢谢!
答案 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')}
]
将完成你想要的。
与仅在控制器线程中运行它们相比,很可能不会从中获得太多性能。您甚至可能会破坏数据库服务器,而不是将其放慢速度。测量线程是否为您带来任何性能,并记住使用线程时存在许多陷阱。