Comment puis-je lancer un autre script en Python sans attendre qu'il finisse? [dupliquer]

cette question a déjà une réponse ici:

je crée un petit tableau de bord pour un utilisateur qui lui permettra d'exécuter des travaux spécifiques. J'utilise Django donc je veux qu'il puisse cliquer sur un lien pour démarrer le travail et ensuite lui retourner la page avec un message que le travail est en cours. Les résultats du travail lui seront envoyés par courriel plus tard.

je crois que je suis censé utiliser subprocess.Popen mais je ne suis pas sûr de cela. Alors en pseudo-code, Voici ce que je veux faire:

if job == 1:
    run script in background: /path/to/script.py
    return 'Job is running'
38
demandé sur Paul D. Waite 2009-02-13 16:56:28

4 réponses

p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
                                    stdout=subprocess.PIPE, 
                                    stderr=subprocess.STDOUT)

qui lancera le sous-processus en arrière-plan. Votre script continuera à fonctionner normalement.

Lire la documentation ici .

61
répondu nosklo 2009-02-13 14:08:42

faire passer ce message dans une file d'attente est certainement la voie à suivre si vous envisagez une mise à l'échelle à long terme. Envoyer un message à la file d'attente qui court constamment en arrière-plan, et écrire des gestionnaires de tâches pour traiter les différents types de messages.

puisque vous utilisez Django, je pense que Beanstalkd est un bon ajustement. Voici , un très bon tutoriel sur le sujet. Le premier commentaire de cet article a quelques bons conseils.

personnellement, J'ai roulé avec un serveur de file d'attente personnalisé en mémoire écrit en Erlang, avec des fixations Python écrites en C. Mais redis semble comme il pourrait fonctionner comme un grand prétendant pour les futures Files d'Attente/messagerie-besoins. Espérons que cette aide!

6
répondu 2009-04-09 17:29:24

sous-processus.Popen est en effet ce que vous cherchez.

3
répondu Aaron Maenpaa 2009-02-13 14:00:25

bien que si vous trouvez que vous voulez commencer à communiquer un tas d'informations entre le sous-processus et le parent, vous pouvez considérer un thread, ou un framework RPC comme Twisted.

mais ils sont probablement trop lourds pour votre application.

1
répondu Sean Cavanagh 2009-02-13 14:12:29