2010-11-04 47 views
4

我正在写一个ruby程序,它将使用线程来完成一些工作。正在完成的工作需要非确定的时间才能完成,并且范围可以从5到45+秒。下面是什么的线程代码看起来像一个粗略的例子:当你不加入你的主题时会发生什么?

loop do       # Program loop 
    items = get_items 
    threads = [] 

    for item in items 
    threads << Thread.new(item) do |i| 
     # do work on i 
    end 

    threads.each { |t| t.join } # What happens if this isn't there? 
    end 
end 

我更倾向于将跳过加入线程,而不是阻止整个应用程序。然而,我不知道这会带来什么长期影响,特别是因为代码几乎立即运行。这是安全的吗?还是有更好的方法来产生一个线程,让它工作,并完成时清理,都在一个无限循环内?

回答

2

写后问题出来了,我意识到这是Web服务器在提供页面时确实需要做的事情。我搜索了一下,发现了以下文章Ruby web server。循环代码看起来很像我的:

loop do 
    session = server.accept 
    request = session.gets 
    # log stuff 

    Thread.start(session, request) do |session, request| 
    HttpServer.new(session, request, basePath).serve() 
    end 
end 

Thread.startis effectively the sameThread.new,所以看来让线程完成并死光是确定的事情。

3

我认为这取决于你的线程工作的内容。例如,如果您的主线程需要打印“X已完成”,则需要加入以确保您显示正确的答案。如果你没有这样的要求,那么你不一定需要加入。

+1

的线程不需要报到主程序。 – 2010-11-04 18:29:09

1

如果拆分工作负载到几个不同的线程,你需要在最后的解决方案,从你肯定需要否则加入不同的线程相结合,你可以做到这一点没有加入..

1

如果您删除了join,那么最终新项目的入门速度可能比旧项目的完成速度更快。如果您一次处理的项目太多,可能会导致性能问题。

您应该使用一个队列,而不是(从http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html片段):

require 'thread' 

    queue = Queue.new 

    producer = Thread.new do 
    5.times do |i| 
     sleep rand(i) # simulate expense 
     queue << i 
     puts "#{i} produced" 
    end 
    end 

    consumer = Thread.new do 
    5.times do |i| 
     value = queue.pop 
     sleep rand(i/2) # simulate expense 
     puts "consumed #{value}" 
    end 
    end 

    consumer.join 
+0

红宝石队列线程安全吗? – 2010-11-06 14:19:31

+0

@Gavin:文档提到了线程,而类来自'thread.rb'。但是,它不使用“线程安全”这些字样。如果你想让他们明确地说它是线程安全的,我可以提交一个文档错误。 – 2010-11-07 00:27:43

+0

我没有发现它来自'thread.rb',这对我来说足够了!我通常在.NET中编程,所以我习惯于明确的“这是线程安全的”vs“这不是线程安全的” – 2010-11-07 03:03:13

相关问题