2010-11-15 16 views
3

Quelqu'un sait comment envoyer une réponse CGI dans Ruby avant que l'exécution du script CGI est terminée?Renvoyer une réponse avec Ruby CGI avant que le script ne soit terminé?

Je crée une API HTTP fire-and-forget. Je veux qu'un client me transmette des données via HTTP et que la réponse retourne avec succès, et puis il balaie les données et effectue un traitement (sans que le client doive attendre une réponse).

J'ai essayé plusieurs choses qui ne marchent pas, y compris la fourche. Les éléments suivants attendent juste 5 secondes lorsqu'ils sont invoqués via HTTP.

#!/usr/bin/ruby 

require 'cgi' 

cgi = CGI.new 
cgi.out "text/plain" do 
    "1" 
end 

pid = fork 
if pid 
    # parent 
    Process.detach pid 
else 
    # child 
    sleep 5 
end 

Répondre

3

J'ai répondu à ma propre question. Il se trouve que j'ai juste besoin de fermer stdin $, stdout $ et stderr $ dans le processus de l'enfant:

#!/usr/bin/ruby 

require 'cgi' 

cgi = CGI.new 
cgi.out "text/plain" do 
    "1" 
end 

pid = fork 
if pid 
    # parent 
    Process.detach pid 
else 
    # child 
    $stdin.close 
    $stdout.close 
    $stderr.close 
    sleep 5 
end 
+0

j'ai pu obtenir ce que je voulais avec 'Process.daemon pid'. – DutGRIFF