Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Threads After Fork

Reply
Thread Tools

Threads After Fork

 
 
James Gray
Guest
Posts: n/a
 
      01-20-2009
Am I understanding this example right:

#!/usr/bin/env ruby -wKU

printer = Thread.new do
10.times do
sleep 1
puts "Thread running in #{Process.pid}..."
end
end

fork do
p [Process.pid, printer.status]
printer.join
end

p [Process.pid, printer.status]
printer.join
# >> [457, "sleep"]
# >> [458, false]
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...
# >> Thread running in 457...

__END__

Are all other threads stopped as part of a process fork?

James Edward Gray II


 
Reply With Quote
 
 
 
 
Tim Pease
Guest
Posts: n/a
 
      01-20-2009
On Jan 20, 2009, at 8:55 AM, James Gray wrote:

> Am I understanding this example right:
>
> #!/usr/bin/env ruby -wKU
>
> printer =3D Thread.new do
> 10.times do
> sleep 1
> puts "Thread running in #{Process.pid}..."
> end
> end
>
> fork do
> p [Process.pid, printer.status]
> printer.join
> end
>
> p [Process.pid, printer.status]
> printer.join
> # >> [457, "sleep"]
> # >> [458, false]
> # >> Thread running in 457...
> # >> Thread running in 457...
> # >> Thread running in 457...
> # >> Thread running in 457...
> # >> Thread running in 457...
> # >> Thread running in 457...
> # >> Thread running in 457...
> # >> Thread running in 457...
> # >> Thread running in 457...
> # >> Thread running in 457...
>
> __END__
>
> Are all other threads stopped as part of a process fork?
>


=46rom the fork documentation ....

"The thread calling fork is the only thread in the created child =20
process. fork doesn=92t copy other threads."

And I modified your script slightly so things are a little more =20
clear ...


#!/usr/bin/env ruby -wKU

p "parent: #{Process.pid}"

printer =3D Thread.new do
10.times do
sleep 1
puts "Thread running in #{Process.pid}..."
end
end

fork do
p "child: #{Process.pid}"
p [Process.pid, printer.status]
printer.join
end

p [Process.pid, printer.status]
printer.join


# >> "parent: 9409"
# >> [9409, "sleep"]
# >> "child: 9410"
# >> [9410, false]
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...
# >> Thread running in 9409...


So when the child is forked, only the parent thread is copied over and =20=

the "printer" thread has been killed in the child. Hence, you get the =20=

"false" response for the status. And I'll stop being pedantic now

Blessings,
TwP=

 
Reply With Quote
 
 
 
 
James Gray
Guest
Posts: n/a
 
      01-20-2009
On Jan 20, 2009, at 1:42 PM, Tim Pease wrote:

> On Jan 20, 2009, at 8:55 AM, James Gray wrote:
>
>> Am I understanding this example right:
>>
>> #!/usr/bin/env ruby -wKU
>>
>> printer =3D Thread.new do
>> 10.times do
>> sleep 1
>> puts "Thread running in #{Process.pid}..."
>> end
>> end
>>
>> fork do
>> p [Process.pid, printer.status]
>> printer.join
>> end
>>
>> p [Process.pid, printer.status]
>> printer.join
>> # >> [457, "sleep"]
>> # >> [458, false]
>> # >> Thread running in 457...
>> # >> Thread running in 457...
>> # >> Thread running in 457...
>> # >> Thread running in 457...
>> # >> Thread running in 457...
>> # >> Thread running in 457...
>> # >> Thread running in 457...
>> # >> Thread running in 457...
>> # >> Thread running in 457...
>> # >> Thread running in 457...
>>
>> __END__
>>
>> Are all other threads stopped as part of a process fork?
>>

>
> =46rom the fork documentation ....
>
> "The thread calling fork is the only thread in the created child =20
> process. fork doesn=92t copy other threads."


Man, I swear I've read that documentation 400 times now and just keep =20=

missing that. Thanks for the reading lesson Tim!

James Edward Gray II=

 
Reply With Quote
 
Bertram Scharpf
Guest
Posts: n/a
 
      01-21-2009
Hi,

Am Mittwoch, 21. Jan 2009, 04:48:14 +0900 schrieb James Gray:
> On Jan 20, 2009, at 1:42 PM, Tim Pease wrote:
>> On Jan 20, 2009, at 8:55 AM, James Gray wrote:
>>
>>> printer =3D Thread.new do
>>> 10.times do
>>> sleep 1
>>> puts "Thread running in #{Process.pid}..."
>>> end
>>> end
>>>
>>> fork do
>>> p [Process.pid, printer.status]
>>> printer.join
>>> end
>>>
>>> Are all other threads stopped as part of a process fork?

>>
>> fork doesn=E2=80=99t copy other threads.

>
> Man, I swear I've read that documentation 400 times now and just keep=20
> missing that.


A soothing fact that even the well-experienced Ruby programmer
sometimes detects new aspects.

I think the amazing strike is that the variable containing the
Thread instance still exists whilst the Thread will surely be
dead. Joining a dead thread does just nothing. I reduced it to
these two lines:

t =3D Thread.new do sleep 100 end
fork do puts t.inspect end

Output:

#<Thread:0x28456bcc dead>

Bertram


--=20
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
fork, threads and proper closing Tomasz Pajor Python 5 06-30-2009 03:58 AM
Is it better to use threads or fork in the following case grocery_stocker Python 12 05-08-2009 10:24 PM
os.fork and pty.fork Eric Snow Python 0 01-08-2009 06:32 AM
fork or threads =?ISO-8859-1?Q?Andreas_M=FCller?= C++ 3 05-18-2005 07:41 PM
HP - fork & exec in Threads hang - intermittently Ajay Bakhshi Python 0 05-03-2004 05:44 PM



Advertisments