[Tutor] cgi script: how to continue a process in the background and return from cgi script

Moritz Lennert mlennert at club.worldonline.be
Fri Feb 10 17:03:18 CET 2006


Hello,

I need some pointers in the right direction for the following problem:

I have a cgi script which reads in some form elements, uses them to 
compose an SQL query, sends that query to the postgresql backend, writes 
the results into a temporary file and sends a mail to the user with the 
link to the file.

The main block of the program is very simple

formulaire = cgi.FieldStorage(keep_blank_values=1)
adresse=formulaire["email1"].value
if adresse == "":
    print_error_adresse()
else:
    requete=compose_req(formulaire) #function composing the query
    print_info_mail(adresse, requete) #function printing a web page 
telling the user that the query is ongoing and that she will be advised 
by email when it is done
    results=req(requete, 91) #function launching the query
    fname=fichier_resultats(results) #function writing the results to a file
    if(fname):
      envoi_res(fname, requete, adresse) #function sending the email to 
the user


The problem I have is that the process obviously remains active 
throughout the entire program, including the query, and that I, 
therefore, sometimes get timeout problems with apache.

So, what I would like to do is to go through all the steps until the 
printing of the web page and then somehow fork the process of querying 
so that the cgi script terminates and the querying, result file writing 
and email sending are done in the background.

I have no experience with either forking or threading, but the way I 
understand them any child processes die when the parent dies.

I have tried the recipe in 
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012 which is 
supposed to fork a process as daemon, thus decoupling it from the 
calling terminal, but I don't seem to get it to work (I get one defunct 
process and the child process, but the timeout problem remains). I am 
also not sure this is actually what I need (I don't know if what I 
describe above is "decoupling from the calling terminal").

So, could some give me a pointer to possible solutions ? Do I have to 
make the last part of my program a seperate program and go through a 
system call ?

Thank you !

Moritz


More information about the Tutor mailing list