Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Python: Python

confused with os.fork()

 

 

Python python RSS feed   Index | Next | Previous | View Threaded


dksreddy at gmail

Nov 25, 2009, 1:52 PM

Post #1 of 4 (165 views)
Permalink
confused with os.fork()

Hi all,
I am a little bit confused about os.fork().
Say I have the following code.

import os
a = ['a','b','c','d','e']

for i in xrange(len(a)):
pid = os.fork()
if not pid:
print a[i]
os._exit(0)

>From most of the tuts and examples I saw online, I expect it to print
a,b,c,d,e.
Sometimes (very rare) it prints something like this:
ab
c
d
e
I thought there is no way a parent process can enter the 'if'.
Can anyone explain this behaviour? Is it the case where parent is
forking a child even before the previous child is printing? In that
case is there a way to prevent that? I can use os.wait(), but I don't
want to wait till the child is finished, just don't want to mix the
child processes, that's it.

- dksr
--
http://mail.python.org/mailman/listinfo/python-list


deets at nospam

Nov 25, 2009, 2:15 PM

Post #2 of 4 (161 views)
Permalink
Re: confused with os.fork() [In reply to]

Sandy schrieb:
> Hi all,
> I am a little bit confused about os.fork().
> Say I have the following code.
>
> import os
> a = ['a','b','c','d','e']
>
> for i in xrange(len(a)):
> pid = os.fork()
> if not pid:
> print a[i]
> os._exit(0)
>
> From most of the tuts and examples I saw online, I expect it to print
> a,b,c,d,e.
> Sometimes (very rare) it prints something like this:
> ab
> c
> d
> e
> I thought there is no way a parent process can enter the 'if'.
> Can anyone explain this behaviour? Is it the case where parent is
> forking a child even before the previous child is printing? In that
> case is there a way to prevent that? I can use os.wait(), but I don't
> want to wait till the child is finished, just don't want to mix the
> child processes, that's it.

Yes, that's the case - you have a race-condition here. Two childs at the
same time write, interleaving their data.

To prevent this, you can use file-locking.

http://docs.python.org/library/fcntl.html#fcntl.lockf

Diez
--
http://mail.python.org/mailman/listinfo/python-list


python at mrabarnett

Nov 25, 2009, 2:33 PM

Post #3 of 4 (160 views)
Permalink
Re: confused with os.fork() [In reply to]

Sandy wrote:
> Hi all,
> I am a little bit confused about os.fork().
> Say I have the following code.
>
> import os
> a = ['a','b','c','d','e']
>
> for i in xrange(len(a)):
> pid = os.fork()
> if not pid:
> print a[i]
> os._exit(0)
>
>>From most of the tuts and examples I saw online, I expect it to print
> a,b,c,d,e.
> Sometimes (very rare) it prints something like this:
> ab
> c
> d
> e
> I thought there is no way a parent process can enter the 'if'.
> Can anyone explain this behaviour? Is it the case where parent is
> forking a child even before the previous child is printing? In that
> case is there a way to prevent that? I can use os.wait(), but I don't
> want to wait till the child is finished, just don't want to mix the
> child processes, that's it.
>
The parent isn't entering the 'if' statement. os.fork() simply forks the
process and then both the parent and the child processes continue.

All of the child processes run independently and there's no guarantee as
to the order in which they'll print, and there's nothing to stop the
printouts from being mixed together (you would need to protect the
'print' with a mutex to do that).
--
http://mail.python.org/mailman/listinfo/python-list


aahz at pythoncraft

Dec 3, 2009, 1:48 PM

Post #4 of 4 (114 views)
Permalink
Re: confused with os.fork() [In reply to]

In article <mailman.997.1259210013.2873.python-list [at] python>,
Dennis Lee Bieber <wlfraed [at] ix> wrote:
>On Wed, 25 Nov 2009 13:52:09 -0800 (PST), Sandy <dksreddy [at] gmail>
>declaimed the following in gmane.comp.python.general:
>>
>> Sometimes (very rare) it prints something like this:
>> ab
>> c
>> d
>> e
>
> Not
>
>ab
>
>c
>d
>e
>
>?

That's what I would guess, too.

> Since all the forked processes are sharing the same output device,
>it is quite possible that their output is getting interleaved.

Actually, I am a tiny bit surprised; I would have expected that a single
output call at the C level would not get interleaved. Of course, it's
quite likely that the string and the \n are separate API calls.
--
Aahz (aahz [at] pythoncraft) <*> http://www.pythoncraft.com/

The best way to get information on Usenet is not to ask a question, but
to post the wrong information.
--
http://mail.python.org/mailman/listinfo/python-list

Python python RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.