ruby可以生成非守护线程吗?

时间:2014-08-30 07:09:33

标签: ruby

对于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一样生成非守护程序线程吗?

1 个答案:

答案 0 :(得分:3)

Ruby Threads默认显示Python守护进程行为,但实际上没有这样的内置概念。

当主程序到达结束时,没有while(或join / value)的示例将退出。

要让线程采取Python非守护进程行为,您必须专门等待它们。

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'