2010-09-24 12 views
1

J'ai une vue qui obtient des données à partir d'une forme et exécute un sous-processus:Comment utiliser correctement et annuler un sous-processus en python en utilisant Django?

def sync_job(request, job_id, src, dest): 
    form = SyncJobForm() 
    check = SyncJob.objects.get(id=job_id) 
    check.status = True 
    check.save() 
    pre_sync = SyncJobCMD.objects.get(id=1) 
    p = Popen([str(pre_sync), '-avu', str(src), str(dest)], stdout=PIPE) 
    syncoutput,syncerror = p.communicate() 
    check.log = syncoutput 
    check.status = False 
    check.save() 
    return render_to_response('sync_form.html', {'syncoutput': syncoutput, 'form': form}, context_instance=RequestContext(request)) 

Je voudrais avoir une option pour annuler le processus en cours d'exécution, mais je ne l'ai pas trouvé comment faire avec le sous-processus. En outre, que se passe-t-il lorsqu'un utilisateur exécute un travail de sous-processus et navigue vers une autre page, le processus se termine-t-il en arrière-plan? Est-il conseillé d'utiliser Shell = True dans ce scénario? Merci.

Répondre

0

A partir de Python 2.6, vous pouvez utiliser Popen.terminate() pour tuer vos processus:

p.terminate() 

Dans les versions antérieures de Python, vous pouvez utiliser os.kill().

os.kill(p.pid, signal.SIGTERM) 

En outre, Popen.communicate() va bloquer jusqu'à ce que votre processus d'enfant a pris fin. Cela signifie que la réponse ne sera pas envoyée à l'utilisateur avant la fin de votre travail de synchronisation.