2010-01-29 7 views
2

J'ai la nécessité de lancer un processus de longue durée en réponse à une demande de formulaire dans django. Ensuite, j'aimerais pouvoir interroger en utilisant ajax et faire en sorte que la vue réponde à l'état du processus (démarré, arrêté ou en cours d'exécution). De plus, je veux être en mesure d'arrêter le processus.état global du processus de longue durée dans django

donc mon point de vue ressemble à ceci:

def start() 
    . . . 
def stop() 
    . . . 
def status() 
    . . . 

Cette question particulière a été abordée à plusieurs reprises sur le SO, mais ma situation est légèrement différente: Je cherche une solution qui est tout à fait pythonique, n'a pas exiger tout ce qui ne se trouve pas dans stock django, et ne nécessite pas l'utilisation d'une base de données.

La chose la plus proche que j'ai trouvé est this post. J'ai implémenté le code, et l'ai simplifié un peu, mais il s'avère que request.session n'est pas global (deux navigateurs ont des sessions différentes).

Il pourrait être que mon problème pourrait être résolu en utilisant autre chose que request.session pour sauver l'état de marche/arrêt/statut, mais je ne sais pas ce que ce serait.

Une autre possibilité, je suis tombé dans ma lecture est middleware django, mais selon this,

__init __() est appelée une seule fois - au démarrage du serveur - pas pour demandes individuelles

Il y a aussi un billet de blog here qui parle de l'état global dans django. Des pensées?

+0

Donc le problème avec ce que @jetxee a posté est que vous voulez que quelqu'un (indépendamment de qui a commencé la tâche de longue durée) soit capable de vérifier la progression de cette tâche? –

+0

Oui, c'est exactement ça. – g33kz0r

+0

Si vous dites "ne nécessite pas quelque chose ne trouve pas en stock django", puis dites "ne nécessite pas l'utilisation d'une base de données." vous avez pris un gros morceau de stock django hors de l'équation, étant donné le couplage de Django à sa base de données. Attention à nous éclairer pourquoi? – Spacedman

Répondre

1

Si l'état doit être accessible à partir de tout processus, et vous ne voulez pas le stocker dans la base de données (et je ne vois pas pourquoi pas, c'est le meilleur endroit pour), vous pouvez stocker dans un fichier temporaire sur le système de fichiers.

+0

C'est ce que j'ai fini par faire. J'ai utilisé un fichier avec l'état connu /tmp/program.pid – g33kz0r

1

Une approche serait de lancer un thread séparé et de le surveiller via le module de filetage.

Questions connexes