Как запустить еще один script в Python, не дожидаясь его завершения?
Я создаю небольшую панель для пользователя, которая позволит ему выполнять определенные задания. Я использую Django, поэтому я хочу, чтобы он мог щелкнуть ссылку, чтобы начать задание, а затем вернуть страницу ему с сообщением о том, что работа запущена. Результаты работы будут отправлены ему по электронной почте позже.
Я полагаю, что я должен использовать subprocess.Popen
, но я не уверен в этом. Итак, в псевдокоде, вот что я хочу сделать:
if job == 1:
run script in background: /path/to/script.py
return 'Job is running'
Ответы
Ответ 1
p = subprocess.Popen([sys.executable, '/path/to/script.py'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
Это запустит подпроцесс в фоновом режиме. Ваш script будет работать нормально.
Прочитайте документацию здесь.
Ответ 2
Запуск этого через очередь сообщений определенно может пойти, если вы думаете о долгосрочном масштабировании. Отправьте сообщение в очередь, которая постоянно работает в фоновом режиме и записывает обработчики заданий для работы с различными типами сообщений.
Поскольку вы используете Django, я думаю, Beanstalkd - это очень хорошо. Вот довольно хороший учебник по этому вопросу. Первый комментарий в этой статье также содержит несколько полезных советов.
Лично я свернул с пользовательским сервером очереди в памяти, написанным в Erlang, с Python-связями, написанными на C. Но redis выглядит так, как будто это может стать отличным соперником для будущих потребностей в очереди/обмена сообщениями. Надеюсь, это поможет!
Ответ 3
subprocess.Popen действительно то, что вы ищете.
Ответ 4
Хотя если вы обнаружите, что хотите начать связывать кучу информации между подпроцессом и родителем, вам может потребоваться рассмотреть поток или инфраструктуру RPC, например, Twisted.
Но, скорее всего, они слишком тяжелы для вашего приложения.