letiantian
letiantian

Reputation: 437

Can ruby generate non-daemonic threads?

For Python, a non-daemonic thread can be generated by set the property daemon. The following is the introduction of daemon

A boolean value indicating whether this thread is a daemon thread (True) or not (False). This must be set before start() is called, otherwise RuntimeError is raised. Its initial value is inherited from the creating thread; the main thread is not a daemon thread and therefore all threads created in the main thread default to daemon = False.

The entire Python program exits when no alive non-daemon threads are left.

https://docs.python.org/2/library/threading.html#threading.Thread.daemon gives more details.

I know Python and Ruby both have method join() to wait for thread terminates. In addition, in the following code snippet, the program will exit when thread a finishes.

#!/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'

Can Ruby generate non-daemonic threads just like Python?

Upvotes: 3

Views: 744

Answers (1)

Matt
Matt

Reputation: 74761

Ruby Threads exhibit the Python daemonic behaviour by default, but really have no such built in concept.

Your example, without the while (or a join/value) will exit when the main program reaches the end.

For Threads to take the Python non daemonic behaviour, you have to specifically wait for them.

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'

Upvotes: 3

Related Questions