From: Marc P. <mpl...@ow...> - 2008-02-07 16:26:56
|
Hello, First of all, i must confess i'm barely win32 literate and a novice python coder. I had to deal with windows services and choose to do it with py2exe. I've taken the first working example around: http://www.developpez.net/forums/archive/index.php/t-16021.html (in French, but the code works) I've played with it and now I have a fully functional windows service, great. But when I try to stress test my service, I notice something I didn't expect: the services system doesn't seem to deal nicely with not responding services. I.E. if I put a "while true: pass" in my main loop, the system doesn't notice that my service doesn't answer anymore, it doesn't even manage to kill it nicely. You can reproduce this behavior by adding the "while loop of death" in DoBatch() in the above example. I'm puzzled with that and I see only 4 options: 1/ the code I've taken is broken somehow, and don't allow the system to be informed of the malfunction of the rest of the code 2/ py2exe is broken^W^W not finished and doesn't allow the system to monitor py2exe services nicely 3/ Windows services are poorly implemented and doesn't allow to detect when a service doesn't respond to events anymore. 4/ I've missed something important. Of course [4] is the more probable answer, yet I wish someone skilled explains me what's going on here. Thank you for your attention. -- Marc Planard |
From: Gordon S. <gsc...@gm...> - 2008-02-07 17:31:14
|
It's number 4. You need to read up on windows services. The service monitor will not forcibly kill your service. The service monitor starts your application and uses a callback to notify your service of certain events. It is the responsibility or the service to respond to these events accordingly and to communicate with the service control manager. By doing "while true: pass" your service is not bothering to check if the service manager has asked it to stop. The typical scenario is to set and event or flag when you get the callback telling you to stop and then checking for this condition in your main loop. Maybe this will help http://www.muukka.net/programming/service/ On Feb 7, 2008 8:22 AM, Marc Planard <mpl...@ow...> wrote: > Hello, > > First of all, i must confess i'm barely win32 literate and a novice > python coder. > > I had to deal with windows services and choose to do it with py2exe. > > I've taken the first working example around: > http://www.developpez.net/forums/archive/index.php/t-16021.html > (in French, but the code works) > > I've played with it and now I have a fully functional windows service, > great. > > But when I try to stress test my service, I notice something I didn't > expect: the services system doesn't seem to deal nicely with not > responding services. I.E. if I put a "while true: pass" in my main > loop, the system doesn't notice that my service doesn't answer anymore, > it doesn't even manage to kill it nicely. > > You can reproduce this behavior by adding the "while loop of death" in > DoBatch() in the above example. > > I'm puzzled with that and I see only 4 options: > 1/ the code I've taken is broken somehow, and don't allow the system > to be informed of the malfunction of the rest of the code > 2/ py2exe is broken^W^W not finished and doesn't allow the system to > monitor py2exe services nicely > 3/ Windows services are poorly implemented and doesn't allow to detect > when a service doesn't respond to events anymore. > 4/ I've missed something important. > > Of course [4] is the more probable answer, yet I wish someone skilled > explains me what's going on here. > > Thank you for your attention. > -- > Marc Planard > > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Py2exe-users mailing list > Py2...@li... > https://lists.sourceforge.net/lists/listinfo/py2exe-users > |
From: Daniel P. <da...@pr...> - 2008-02-07 18:37:02
Attachments:
GenericService.py
|
Marc, perhaps an example of a generic service will help. I've attached source to a simple generic service. Just subclass the GenericService and use it directly if you like. You just need to ensure that the mainLoop() function returns as soon as possible. In production services, I always have a main loop that just checks WaitForSingleObject() and spawns new worker threads as needed, and all my actual processing happens in worker threads. You may also want to read up on the threading module if you're unfamiliar with threads. - Daniel. Gordon Scott wrote: > It's number 4. You need to read up on windows services. > The service monitor will not forcibly kill your service. The service > monitor starts your application and uses a callback to notify your > service of certain events. It is the responsibility or the service to > respond to these events accordingly and to communicate with the service > control manager. > > By doing "while true: pass" your service is not bothering to check if > the service manager has asked it to stop. The typical scenario is to > set and event or flag when you get the callback telling you to stop and > then checking for this condition in your main loop. > > Maybe this will help > > http://www.muukka.net/programming/service/ > > > > On Feb 7, 2008 8:22 AM, Marc Planard <mpl...@ow... > <mailto:mpl...@ow...>> wrote: > > Hello, > > First of all, i must confess i'm barely win32 literate and a novice > python coder. > > I had to deal with windows services and choose to do it with py2exe. > > I've taken the first working example around: > http://www.developpez.net/forums/archive/index.php/t-16021.html > (in French, but the code works) > > I've played with it and now I have a fully functional windows service, > great. > > But when I try to stress test my service, I notice something I didn't > expect: the services system doesn't seem to deal nicely with not > responding services. I.E. if I put a "while true: pass" in my main > loop, the system doesn't notice that my service doesn't answer anymore, > it doesn't even manage to kill it nicely. > > You can reproduce this behavior by adding the "while loop of death" in > DoBatch() in the above example. > > I'm puzzled with that and I see only 4 options: > 1/ the code I've taken is broken somehow, and don't allow the system > to be informed of the malfunction of the rest of the code > 2/ py2exe is broken^W^W not finished and doesn't allow the system to > monitor py2exe services nicely > 3/ Windows services are poorly implemented and doesn't allow to detect > when a service doesn't respond to events anymore. > 4/ I've missed something important. > > Of course [4] is the more probable answer, yet I wish someone skilled > explains me what's going on here. > > Thank you for your attention. > -- > Marc Planard > > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Py2exe-users mailing list > Py2...@li... > <mailto:Py2...@li...> > https://lists.sourceforge.net/lists/listinfo/py2exe-users > > > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > > > ------------------------------------------------------------------------ > > _______________________________________________ > Py2exe-users mailing list > Py2...@li... > https://lists.sourceforge.net/lists/listinfo/py2exe-users |
From: Larry B. <lar...@we...> - 2008-02-07 21:58:10
|
Marc Planard wrote: > Hello, > > First of all, i must confess i'm barely win32 literate and a novice > python coder. > > I had to deal with windows services and choose to do it with py2exe. > > I've taken the first working example around: > http://www.developpez.net/forums/archive/index.php/t-16021.html > (in French, but the code works) > > I've played with it and now I have a fully functional windows service, > great. > > But when I try to stress test my service, I notice something I didn't > expect: the services system doesn't seem to deal nicely with not > responding services. I.E. if I put a "while true: pass" in my main > loop, the system doesn't notice that my service doesn't answer anymore, > it doesn't even manage to kill it nicely. > > You can reproduce this behavior by adding the "while loop of death" in > DoBatch() in the above example. > > I'm puzzled with that and I see only 4 options: > 1/ the code I've taken is broken somehow, and don't allow the system > to be informed of the malfunction of the rest of the code > 2/ py2exe is broken^W^W not finished and doesn't allow the system to > monitor py2exe services nicely > 3/ Windows services are poorly implemented and doesn't allow to detect > when a service doesn't respond to events anymore. > 4/ I've missed something important. > > Of course [4] is the more probable answer, yet I wish someone skilled > explains me what's going on here. > > Thank you for your attention. Yes services work VERY well. I've written a number of them (some relatively complex) that work flawlessly. Others have pointed out why your while true: pass test won't work. You aren't implementing sleep, check, dorun, sleep cycle in the loop as you should. Pick up a copy of Python on Win32 by Mark Hammond (et. al). It is a great resource for all things Windows (services, COM, etc.). -Larry |