代码之家  ›  专栏  ›  技术社区  ›  Ruben Quinones

如何使用django在python中正确地使用和取消子进程?

  •  1
  • Ruben Quinones  · 技术社区  · 15 年前

    我有一个从表单获取数据并执行子流程的视图:

    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吗?谢谢。

    2 回复  |  直到 14 年前
        1
  •  0
  •   Arlaharen    15 年前

    从python 2.6开始,您可以使用 Popen.terminate() 要终止进程:

    p.terminate()
    

    在早期版本的python中,可以使用 os.kill() .

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

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

        2
  •  0
  •   Kristian Glass adrianz    14 年前

    此外,您还可以使用信号(例如,杀死信号;有关更多详细信息,请参见 documentation for the signal module ):

    import signal
    p.send_signal(signal.SIGKILL)