2010-09-24 44 views
1

我有一个从形式获取数据,并执行一个子视图:如何正确使用和取消使用Django的Python中的子进程?

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)) 

我想有一个选项,取消正在运行的进程,但我还没有找到如何做到这一点与子进程。另外,当用户运行子流程作业并导航到另一个页面时会发生什么情况,该流程是否会在后台完成?在这种情况下建议使用Shell = True吗?谢谢。

回答

0

在Python 2.6开始,你可以使用Popen.terminate()杀死你的流程:

p.terminate() 

在较早版本的Python,您可以使用os.kill()

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

此外,Popen.communicate()将阻塞,直到您的子进程终止。这意味着在同步作业终止之前,响应不会发送给用户。

相关问题