Thierry Florac a écrit :
  Bonjour tout le monde,

J'ai actuellement un petit souci de gestion de threads sous Zope3 que je
ne parviens pas à résoudre ; je vous explique...

Je dois lancer des opérations longues voire très longues sur un serveur
Zope3 (release 3.3.1 pour être exact), pour lesquelles l'utilisateur ne
saurait attendre la fin du traitement ; il s'agit en l'occurrence de
conversion de vidéos en Flash avec FFMPEG.
Ce que j'aimerais faire consiste donc, dans l'ordre :
 - à la fin du téléchargement, intégrer le nouveau fichier dans une
liste de fichiers à convertir et rendre la main immédiatement à
l'utilisateur
 - régulièrement, vérifier via un autre tâche (héritée de
twisted.internet.task.LoopingCall) s'il y a des fichiers en attente, et
dans ce cas les convertir.
 - à la fin de la conversion, mettre à jour différentes métadonnées
associées au fichier converti et supprimer le fichier original.

Ce processus en lui même ne pose pas de problème ; là où ça coince c'est
que pendant tout le processus de conversion, le serveur ne répond pas
aux requêtes. Gênant, non ?

Je suis donc preneur de toute idée, sachant que mon code est structuré
un peu comme ça :
 - class ConversionManager(tâche principale) : connectée à la base via
ZEO ; toutes les 60 secondes, il extrait la liste des fichiers à
convertir ; pour chaque fichier, teste s'il existe un utilitaire de
conversion adapté au contentType du fichier, et si oui demande la
conversion ; cette conversion est lancée via un thread
"ConversionManagerThread" (en mode setDaemon(True))
 - class ConversionManagerThread(hérite de Thread) : prend en paramètre
le fichier à convertir et l'utilitaire de conversion à utiliser, et
demande le lancement de l'utilitaire ; à la fin de la conversion, met à
jour les métadonnées du fichier si tout s'est bien passé et supprime le
fichier original
 - utilitaire de conversion : lance la commande FFMPEG avec ses
paramètres via os.spawnlp, en mode os.P_WAIT ; renvoie à la fin de la
conversion différentes informations liées au résultat de l'opération.

Je fais ce genre de chose dans l'Eztranet http://eztranet.gorfou.fr
Les sources sont là (sauf la 1.3 qu'est pas finie) http://gorfou.fr/eztranet/
Par contre c'est pas du ZEO, et c'est en zope 3.4 avec Paste au lieu de Twisted.
Mais la 1ere version était aussi sous 3.3.1 je crois, avec twisted, et se comportait un peu comme tu dis, mais pendant l'upload seulement. Pendant la conversion ca répondait bien.

Peut-être tu peux lancer le ffmpeg et l'oublier, puis demander à la vue elle-même d'aller vérifier si le fichier a fini d'être encodé ? Je faisais un truc comme ça jusqu'à la 1.2. Dans la 1.3 j'écris maintenant un blob directement dans le thread à la fin de l'encodage. Ca évite de laisser trainer plein de fichiers dans un répertoire temporaire.

Si tu essayes zc.async, je suis curieux d'avoir ton retour.

Christophe

PS : as-tu vu la barre de progression d'upload qui tue grâce à gawel ? :)
(cf. gp.fileupload)


Merci d'avance,

  Thierry Florac

_______________________________________________
zope3-french-user mailing list
zope3-french-user@lists.afpy.org
http://lists.afpy.org/mailman/listinfo/zope3-french-user

Répondre à