Подтвердить что ты не робот

Как запустить еще один script в Python, не дожидаясь его завершения?

Я создаю небольшую панель для пользователя, которая позволит ему выполнять определенные задания. Я использую Django, поэтому я хочу, чтобы он мог щелкнуть ссылку, чтобы начать задание, а затем вернуть страницу ему с сообщением о том, что работа запущена. Результаты работы будут отправлены ему по электронной почте позже.

Я полагаю, что я должен использовать subprocess.Popen, но я не уверен в этом. Итак, в псевдокоде, вот что я хочу сделать:

if job == 1:
    run script in background: /path/to/script.py
    return 'Job is running'
4b9b3361

Ответ 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.

Но, скорее всего, они слишком тяжелы для вашего приложения.