Roy Smith wrote: > [EMAIL PROTECTED] wrote: > > >>Hello, >> >>I write a lot of CGI scripts, in Python of course. Now I need to >>convert some to long-running processes. I'm having trouble finding >>resources about the best practices to do that. >> >>I've found a lot of email discussions that say something like, "You >>need to educate yourself about the differences when you have long- >>running processes" but I've not had a lot of luck with finding things >>that explain the differences. > > > The biggest differences between run-and-exit vs. long running processes are > resource management and error recovery. Let's take them one at a time. > > Resource management. In a short-lived process, you really don't have to > worry about this at all. Snarf as much memory as you need, open as many > files as you want, and when you exit, the operating system cleans it all up > for you. With a long running process, you have to worry about stuff like > that. > > In Python, you're isolate from the low-level details of memory management, > but still need to think about it a bit. Imagine you had code that looked > like this in your main loop: > > for request in getNextRequest(): > requestList.append (request) > processRequest(request) > > requestList is going to keep growing without bounds and eventually will eat > up all available memory in the system and your process will crash. > Everything you store, you also need to delete when you're done with it.
In particular, it is a good idea to call gc.collect() every now and then, specially if you are in such a loop. I don't know what is the gc policy in python, but an application of mine that seemed to eat as much memory as it was available was reduced to a constant small amount of memory after I started to call the gc directly. > The other big thing is error recovery. In a short lived process, if > something fails, you print an error message and exit. In a long running > process, you need to somehow recover from the error and keep going as best > you can. This can be tricky. You should have your main loop inside a try/except, to catch any exceptions that were not otherwise caught without exiting the application. Log the exceptions, of course, but in most long running applications work in a loop like Roy Smith's code above, so if one of them fails it won't disrupt the others to come. -- Bruno Barberi Gnecco <brunobg_at_users.sourceforge.net> The earth is like a tiny grain of sand, only much, much heavier. -- http://mail.python.org/mailman/listinfo/python-list