[python-win32] Pythonservice.exe running at 100%
Jim Vickroy
Jim.Vickroy@noaa.gov
Tue, 19 Mar 2002 11:10:36 -0700
David, have you tried running your application as a process (not a MS Windows
Service)? Specifically, have you "unit tested" the "run_test" and "send_results"
methods to see if they exhibit the same behavior in isolation?
I have many (more than 10) MS Windows Services (implemented in Python) running in
parallel and have never observed this behavior either.
David Rock wrote:
> On Tue, Mar 19, 2002 at 05:13:30PM +1100, Mark Hammond wrote:
> > > Every time I try to run a service on Windows NT4, it always runs at 100%
> > > CPU utilization. Why does pythonservice.exe do this and is there any way
> > > that I can throttle it back? I have managed to minimize the amount of
> > > time that the service app I am running takes, so that it is not a
> > > tremendous strain on the system (just a couple seconds) but I would like
> > > to manage this better.
> >
> > Something is almost certainly wrong with your service. The test services do
> > not exhibit this. Check that your loops that are supposed to be waiting for
> > something actually are :)
>
> Here is the core of my SvcDoRun:
>
> timeout = 120000
> waitHandle = self.hWaitStop
>
> while 1:
> rc = win32event.WaitForSingleObject( waitHandle, timeout )
> if rc == win32event.WAIT_OBJECT_0:
> #stop event
> break
> else:
> start_time = time.time()
> self.run_test(loop)
> end_time = time.time()
> diff_time = end_time - start_time
> self.send_results( start_time, end_time, diff_time,
> string.lower(t_server), c_server,
> ftpuser, ftppass, patrol )
>
> While it is waiting for the self.hWaitStop there is no activity, which
> is what I expect. When the timeout hits and runs the else statement,
> this is where I have problems. What I do is run a test loop to measure
> the amount of time it takes for a system to do some basic I/O operations
> and then it ftps those results to a collection server. Here are the two
> modules I am using for this:
>
> def run_test(self, loop):
>
> # Create tempfile to write data to
> tmp = tempfile.mktemp('.tmp')
> fp = open( tmp, 'w' )
>
> for x in xrange(1,loop):
> print >>fp, 'This is a file write test:'
> print >>fp, '%s' % ( os.listdir( os.environ['systemdrive'] ) )
> fp.seek(0)
> fp.truncate()
>
> fp.close()
> os.remove( tmp )
>
> def send_results(self,stime,etime,dtime,tserver,cserver,
> ftpuser,ftppass,patrol):
> if dtime > 3:
> err = 'ERROR'
> else:
> err = ''
>
> if patrol == 'no':
> tmp = tempfile.mktemp('.tmp')
> fp = open( tmp, 'w' )
> tmpdate = time.asctime(time.localtime(stime))
> print >>fp, '%s,%s,%f,%s' % ( tserver, tmpdate, dtime, err )
> fp.close()
>
> # ftp to logging server and append to a log file.
> ftpcmd = 'APPE pyperf/' + tserver + '.log'
> fp = open( tmp, 'r' )
> ftp = ftplib.FTP( cserver )
> ftp.login( ftpuser, ftppass )
> ftp.storlines( ftpcmd, fp )
> ftp.quit()
> fp.close()
> os.remove( tmp )
>
> print '%d' % ( dtime )
>
> Somewhere within one of these two modules is where it pegs the system at
> 100%. I am pretty new to using Python for writing a service or any
> Windows event driven programs for that matter, so I have no idea if
> there is a better way to do this or not.
>
> You mentioned that I should be making sure that the loop is actually
> waiting for something. The only loop that waits for anything is the
> main loop that waits for the stop service event. Everything else is
> running after that point. Is there anything I can do within the other
> modules to get it under control?
>
> Thanks.
>
> --
> David Rock
> david@rock.homelinux.com
>
> _______________________________________________
> Python-win32 mailing list
> Python-win32@python.org
> http://mail.python.org/mailman/listinfo/python-win32