当你不加入你的主题时会发生什么?

Gav*_*ler 5 ruby multithreading

我正在编写一个 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
Run Code Online (Sandbox Code Playgroud)

我的偏好是跳过加入线程而不是阻塞整个应用程序。但是我不知道这有什么长期影响,特别是因为代码几乎立即再次运行。这是安全的做法吗?或者有没有更好的方法来生成一个线程,让它工作,并在它完成时清理,所有这些都在一个无限循环中?

Gav*_*ler 2

写出问题后,我意识到这正是网络服务器在提供页面时所做的事情。我用 google 搜索并找到了以下有关Ruby Web 服务器的文章。循环代码看起来非常像我的:

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
Run Code Online (Sandbox Code Playgroud)

Thread.start 实际上与 相同Thread.new因此看起来让线程完成并消失是可以的。