0

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

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

家庭控制器

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 %>

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

另一个控制器

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

我认为线程有问题。有人可以帮助我了解为什么会这样吗?是不是因为我已经在首页执行了一个线程,然后当我想转到另一个页面时,它又运行了一个线程,它不起作用?

谢谢!

4

1 回答 1

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')}
]

会完成你想要的。

与仅在控制器线程中运行它们相比,您很可能不会从中获得太多性能。您甚至可能会破坏数据库服务器,反而会降低它的速度。一定要衡量线程是否能给你带来任何性能,并记住使用线程时有很多陷阱。

于 2013-04-19T05:59:20.823 回答