Pls keep your posts on the list - so that others can help and so that others can search for problems/solutions! ----- Original Message ----- From: "Daniel Lopez" <dev101@vivademocracy.com> To: <dev101@magma.ca> Sent: Friday, October 13, 2006 12:13 PM Subject: zope fork in external method
Jonathan-
I'm emailing you because I saw your post a few months back at:
http://mail.zope.org/pipermail/zope/2006-May/166574.html
I've been doing my best to find answers on existing posts, but to no avail. Perhaps you can send further pointers?
On my system, a user can hit a page that initiates a long database query. If the user hits the stop button and tries to refresh, it messes things up (by interrupting the code upon return of the query), so I came up with a solution that almost works:
I put all the code into an external method, which forks. The parent returns a redirect to a "waiting" throbber page that uses Ajax to poll whether the query is done. The child then goes on to do the hard work.
This is working as desired, with a single exception: zombie child processes. Where can I learn more about forking processes in zope external methods? I've read about the double-fork method, but that hasn't resolved the problem...
A few ideas for reaping dead child processes: 1) implement a SIGCHLD handler 2) when a spawned child process is finished its 'zope processing' have it write its process id to a file (be careful when accessing files, you will need locking to eliminate problems that may be caused by zope's multiple threads) and then have a clean up routine which kills all of the processes listed in the file (this could be an independant clean-up routine which wakes up on a regular basis, or it could be built into the 'spawning' process which does the clean up before it spawns a child). 3) as the last thing it does, have the child process issue a kill -9 system command to kill its own process (I haven't tried this myself, but it may work and it would be simple to implement) Good luck! Jonathan