Ruby能生成非守护线程吗?

3
对于Python,可以通过设置属性daemon生成非守护线程。以下是daemon的介绍:

一个布尔值,指示此线程是否是守护线程(True)还是非守护线程(False)。这必须在调用start()之前进行设置,否则将引发RuntimeError。它的初始值继承自创建线程;主线程不是守护线程,因此在主线程中创建的所有线程默认为daemon = False。

当没有存活的非守护线程时,整个Python程序将退出。

https://docs.python.org/2/library/threading.html#threading.Thread.daemon提供了更多详细信息。

我知道Python和Ruby都有方法join()来等待线程终止。另外,在下面的代码段中,当线程a完成时,程序将退出。
#!/usr/bin/env ruby
# coding: UTF-8

a = Thread.new() do
    1000.times do |value|
        puts "---" + value.to_s
    end
end

while a.status != false 
    # do something
end
puts 'I am the main thread'

Ruby是否能像Python一样生成非守护线程?

我认为 Ruby 没有这样的概念。无论其他线程的状态如何,当主线程退出时,程序都会退出。 - Frederick Cheung
1个回答

3

默认情况下,Ruby 线程表现出Python的守护进程(daemonic)行为,但实际上没有这样的内置概念。

你的例子中,如果没有while(或者join/value),程序将在主程序结束时退出。

要让线程表现出Python的非守护(daemonic)行为,必须显式地等待它们。

require 'thwait' #stdlib

wait_threads = []

wait_threads.push( Thread.new() do
  1000.times do |value|
    printf "%s ", value
  end
end )

Thread.new() do
  sleep 1
  puts "I am like a python daemon"
end

ThreadsWait.all_waits( *wait_threads )
puts 'I am the main thread'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接