Как правильно использовать и отменить подпроцесс в Python с помощью Django? - PullRequest
1 голос
/ 24 сентября 2010

У меня есть представление, которое получает данные из формы и выполняет подпроцесс:

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 ]

0 голосов
/ 24 сентября 2010

Также вы можете использовать сигналы (например, сигнал уничтожения; более подробную информацию см. В документации для сигнального модуля ):

import signal
p.send_signal(signal.SIGKILL)
0 голосов
/ 24 сентября 2010

Начиная с Python 2.6, вы можете использовать Popen.terminate(), чтобы убить ваши процессы:

p.terminate()

В более ранних версиях Python вы можете использовать os.kill().

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

Кроме того, Popen.communicate() будет блокироваться, пока ваш дочерний процесс не завершится. Это означает, что ответ не будет отправлен пользователю до тех пор, пока не завершится задание синхронизации.

...