Appel de programme non bloquant

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

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 http://www.gnu.org/philosophy/no-word-attachments.fr.html

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.

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 :

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

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.

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

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 !

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 ?

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