Spawing a thread and printing dots until it finishes

Larry Bates larry.bates at websafe.com`
Tue Apr 22 14:08:20 EDT 2008


sophie_newbie wrote:
> On Apr 22, 4:41 pm, "D'Arcy J.M. Cain" <da... at druid.net> wrote:
>> On Tue, 22 Apr 2008 07:10:07 -0700 (PDT)
>>
>>
>>
>> sophie_newbie<paulgeele... at gmail.com> wrote:
>>> import threading
>>> class MyThread ( threading.Thread ):
>>>         def run ( self ):
>>>                 myLongCommand()...
>>> import time
>>> t = MyThread()
>>> t.start()
>>> while t.isAlive():
>>>         print "."
>>>         time.sleep(.5)
>>> print "OK"
>>> The thing is this doesn't print a dot every half second. It just
>>> pauses for ages until the thread is finished and prints prints ".OK".
>>> But if I take out the "time.sleep(.5)" line it will keep printing dots
>>> really fast until the thread is finished. So it looks like its the
>>> time.sleep(.5) bit that is messing this up somehow?
>> We know that your main routine gives up the processor but without a
>> full definition of MyThread how do we know that it ever does?  I
>> suspect that it hits sleep once, if at all, and then goes to the final
>> print statement.  In fact, I suspect that this is not exactly what you
>> tried anyway.  This code would not have printed ".OK" whether it
>> entered the loop or not.  It could have printed this;
>>
>> .
>> OK
>>
>> because the print statement in the loop will print a dot on a line by
>> itself.
>>
>> When looking for these sorts of answers you should really try to create
>> a smallest program that exhibits the behaviour you are questioning and
>> then cut and paste the entire script into your message unedited.  Often
>> enough you will even answer your own question in the process.
>>
>> --
>> D'Arcy J.M. Cain <da... at druid.net>         |  Democracy is three wolveshttp://www.druid.net/darcy/               |  and a sheep voting on
>> +1 416 425 1212     (DoD#0082)    (eNTP)   |  what's for dinner.
> 
> "myLongCommand()... " is a call to an function in R (the statistical
> programming language) via Rpy (A python module that allows calls to
> R). The call takes a couple of minutes to execute. I'm trying to build
> a web front end to this R function and instead of the user looking at
> a blank screen for 2-3 mins, I want to print dots to let them feel
> like the program isn't hanging.
> 
> What I am saying is that without the "time.sleep(.5)" line, the above
> code will print dots on the screen continuously for 2-3 mins, filling
> it up with a ridiculous ammount of dots.
> 
> Whereas with the time.sleep line, instead of pausing for half a second
> between dots, its seems to print, as you correctly pointed out:
> 
> .
> OK
> 
> With a pause of 2-3 minutes between the . and the OK.
> 
> I hope that clears things up a little. I haven't the faintest idea why
> the code above doesn't work but hope someone has an idea. It wouldn't
> be something to do with python not being able to handle multiple
> threads at the same time or something? I hope there is a workaround.

For a web front end you wouldn't go this route at all.  You would get a
progressive .GIF file that gets loaded into the client's browser and shows
"activity" while the server does its thing.  When the browser refreshes
(after the server application completes) it would go away.  You can't
update a client's browser by writing dots to anything.

Hope this helps.

-Larry



More information about the Python-list mailing list