franz  
                
               
               
              
                  
                    July 9, 2007,  4:56pm
                   
                   
              1 
               
             
            
              Bonjour,
Est-ce-que quelqu’un sait comment faire un appel non bloquant à  un autre 
programme  svp ?
Je m’explique : 
J’ai développé une simple appli web en Rails qui permet d’uploader des 
images sur le serveur et d’effectuer des traitements sur ces images. Ces 
traitements sont effectuer par d’autres programmes (c et c++) dont j’ai 
regroupé les différents appels dans un script ruby. Ensuite dans mon 
controlleur, je lance mon script ruby de la manière suivante :
command="ruby mon_script.rb"
pipe = IO.popen command,"r"
@result = pipe.read
pipe.close
 
et je récupère les sorties des programmes par l’intermédiaire du pipe 
pour les afficher sur la page qui est renvoyée à  l’utilisateur qui a 
envoyé les images.
Le problème, c’est que ces traitements sont assez couteux en temps et 
ressources, et j’aimerai pouvoir effectuer l’appel au script en mode non 
bloquant pour que si une autre personne veux venir uploader des images 
pendant que le serveur traite d’autres images, il puisse ne serait-ce 
qu’accéder à  la page d’upload (ce qui n’est pas possible à  l’heure 
actuelle tant que le traitement des autres images envoyées avant n’est 
pas fini).
Si vous avez une solution, je suis preneur !
Merci !
Franz
             
            
               
               
               
            
            
                 
                 
              
           
          
            
              
                franz  
                
               
               
              
                  
                    July 9, 2007,  5:04pm
                   
                   
              2 
               
             
            
              Le 09/07/07, Franz R.[email protected]   a écrit :
Est-ce-que quelqu’un sait comment faire un appel non bloquant à un autre 
Le problème, c’est que ces traitements sont assez couteux en temps et 
ressources, et j’aimerai pouvoir effectuer l’appel au script en mode non 
bloquant pour que si une autre personne veux venir uploader des images 
pendant que le serveur traite d’autres images, il puisse ne serait-ce 
qu’accéder à la page d’upload (ce qui n’est pas possible à l’heure 
actuelle tant que le traitement des autres images envoyées avant n’est 
pas fini).
 
Upload en lessive ! 
Avec ajax tu devrais pouvoir lancer le traitement “en tache de fond” 
coté client.
Dans ce genre de problématique le protocole HTTP n’est pas vraiment la 
meilleur solution, même si certaine existent (je crois qu’on doit 
pouvoir faire autrement qu’avec ajax).
Désolé de pas te donner plus d’info sur une solution, j’ai rien sous 
la main pour tester.
– 
Je vous serais reconnaissant de ne pas m’envoyer de pièces jointes 
aux formats Wmv, Word, Excel, PowerPoint, RTF,  fichiers aux formats 
propriétaires. 
Utilisez des formats universels et libres tels que texte, html, 
OpenOffice.Org , TeX, à la limite PDF, Ogg. Merci. 
Voir Finissons-en avec les pièces jointes Word - Projet GNU - Free Software Foundation 
             
            
               
               
               
            
            
                 
                 
              
           
          
            
              
                franz  
                
               
               
              
                  
                    July 9, 2007,  5:04pm
                   
                   
              3 
               
             
            
              On Mon, 2007-07-09 at 16:56 +0200, Franz R. wrote:
controlleur, je lance mon script ruby de la manière suivante : 
Le problème, c’est que ces traitements sont assez couteux en temps et 
ressources, et j’aimerai pouvoir effectuer l’appel au script en mode non 
bloquant pour que si une autre personne veux venir uploader des images 
pendant que le serveur traite d’autres images, il puisse ne serait-ce 
qu’accéder à  la page d’upload (ce qui n’est pas possible à  l’heure 
actuelle tant que le traitement des autres images envoyées avant n’est 
pas fini).
Si vous avez une solution, je suis preneur !
 
Idéalement, tu devrais implémenter une solution de tickets : une demande 
crée un ticket dans ta base. Le ticket est traité par tes programmes en 
c/c++ et son status est mis a jour avec le résultat. Enfin, il faut que 
le client vérifie périodiquement l’état du ticket.
C’est plus ou moins ce qui est implémenté chez yahoo pour flickr.
             
            
               
               
               
            
            
                 
                 
              
           
          
            
              
                franz  
                
               
               
              
                  
                    July 9, 2007,  5:34pm
                   
                   
              4 
               
             
            
              Regarde du côté de BackgroundDRb http://backgroundrb.rubyforge.org/  ou 
plus directement, du côté de DRb http://chadfowler.com/ruby/drb.html 
++
yk
Le 09/07/07, Franz R.[email protected]   a écrit :
             
            
               
               
               
            
            
                 
                 
              
           
          
            
              
                franz  
                
               
               
              
                  
                    July 9, 2007,  6:30pm
                   
                   
              5 
               
             
            
              Le 09/07/07, Frédéric Logier[email protected]   a écrit :
Le 09/07/07, Yann KLIS a écrit :
Regarde du côté de BackgroundDRb 
http://backgroundrb.rubyforge.org/  ou 
plus directement, du côté de DRb 
http://chadfowler.com/ruby/drb.html 
 
Je confirme, backgroundrb est la solution.
 
Disons que je trouve que backgroundrb n’est pas assez prédictif et pas 
assez facile à tester (genre pour envoyer des requêtes à travers le 
pipeline), alors que faire un serveur DRb et un client DRb qui s’y 
connecte s’est fait en quelques lignes…
++
yk
             
            
               
               
               
            
            
                 
                 
              
           
          
            
              
                franz  
                
               
               
              
                  
                    July 9, 2007,  6:25pm
                   
                   
              6 
               
             
            
              Le 09/07/07, Yann KLIS a écrit :
Regarde du côté de BackgroundDRb http://backgroundrb.rubyforge.org/  ou 
plus directement, du côté de DRb http://chadfowler.com/ruby/drb.html 
 
Je confirme, backgroundrb est la solution.
             
            
               
               
               
            
            
                 
                 
              
           
          
            
              
                franz  
                
               
               
              
                  
                    July 9, 2007,  8:55pm
                   
                   
              7 
               
             
            
              Le 09/07/07, Frédéric Logier[email protected]   a écrit :
Le 09/07/07, Yann KLIS a écrit :
Disons que je trouve que backgroundrb n’est pas assez prédictif et pas 
assez facile à tester (genre pour envoyer des requêtes à travers le 
pipeline), alors que faire un serveur DRb et un client DRb qui s’y 
connecte s’est fait en quelques lignes…
 
Ton serveur DRb a accès à ActiveRecord sans rien faire ?
 
Comme n’importe quel autre script Ruby :
require ‘drb’ 
RAILS_ENV = ARGV[0] || ‘development’ 
require File.dirname(FILE ) + ‘/…/config/environment’
++
yk
             
            
               
               
               
            
            
                 
                 
              
           
          
            
              
                franz  
                
               
               
              
                  
                    July 10, 2007,  9:36am
                   
                   
              8 
               
             
            
              Merci à tous pour ces conseils ! 
Je vais essayer tout ça voir ce qui va le mieux avec ce que j’ai déjà 
fait et je vous ferais savoir comment j’ai résolu le problème !
             
            
               
               
               
            
            
                 
                 
              
           
          
            
              
                franz  
                
               
               
              
                  
                    July 9, 2007,  7:06pm
                   
                   
              9 
               
             
            
              Le 09/07/07, Yann KLIS a écrit :
Disons que je trouve que backgroundrb n’est pas assez prédictif et pas 
assez facile à tester (genre pour envoyer des requêtes à travers le 
pipeline), alors que faire un serveur DRb et un client DRb qui s’y 
connecte s’est fait en quelques lignes…
 
Ton serveur DRb a accès à ActiveRecord sans rien faire ?
             
            
               
               
               
            
            
                 
                 
              
           
          
            
              
                franz  
                
               
               
              
                  
                    July 10, 2007,  2:28pm
                   
                   
              10 
               
             
            
              Bon je crois avoir réussi à mettre en place backgroundrb.
Sauf que j’ai l’impression, voire je suis sûr, que du coup ça n’exécute 
plus mon script par le pipe, vu que je ne récupère jamais le résultat…
Avez vous une idée de comment je pourrais faire pour faire exécuter le 
script, et par la même occasion les autres programmes, autrement que par 
un pipe ?
Merci !
Franz