web-dev-qa-db-fra.com

Comment exécuter un autre script dans Python sans attendre qu'il se termine?

Je crée un petit tableau de bord pour un utilisateur qui lui permettra d'exécuter des tâches spécifiques. J'utilise Django donc je veux qu'il puisse cliquer sur un lien pour démarrer le travail, puis lui renvoyer la page avec un message indiquant que le travail est en cours d'exécution. Les résultats du travail lui sera envoyé ultérieurement.

Je crois que je suis censé utiliser subprocess.Popen mais je n'en suis pas sûr. Donc en pseudocode, voici ce que je veux faire:

if job == 1:
    run script in background: /path/to/script.py
    return 'Job is running'
40
sheats
p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
                                    stdout=subprocess.PIPE, 
                                    stderr=subprocess.STDOUT)

Cela démarrera le sous-processus en arrière-plan. Votre script continuera de fonctionner normalement.

Lisez la documentation ici .

62
nosklo

L'exécution de cette opération dans une file d'attente de messages est certainement la voie à suivre si vous envisagez une mise à l'échelle à long terme. Envoyez un message à la file d'attente qui s'exécute constamment en arrière-plan et écrivez des gestionnaires de travaux pour gérer les différents types de messages.

Puisque vous utilisez Django, je pense que Beanstalkd est un assez bon ajustement. Voici un joli joli tutoriel sur le sujet. Le premier commentaire de cet article contient également de bons conseils.

Personnellement, j'ai roulé avec un serveur de file d'attente en mémoire personnalisé écrit en Erlang, avec des liaisons Python écrites en C. Mais redis semble que cela pourrait fonctionner comme un excellent concurrent pour les futures files d'attente/messagerie- Besoins. J'espère que cela t'aides!

6
user89069

subprocess.Popen est en effet ce que vous recherchez.

3
Aaron Maenpaa

Bien que si vous souhaitez commencer à communiquer un ensemble d'informations entre le sous-processus et le parent, vous souhaiterez peut-être envisager un thread ou une infrastructure RPC comme Twisted.

Mais ils sont probablement trop lourds pour votre application.

1
Sean Cavanagh