Django rest, запуск стороннего скрипта в бэкграунде

Django rest, запуск стороннего скрипта в бэкграунде

13.11.2017 09:47:46 Просмотров 16 Источник

Имеется сервер на django, который, в ответ на запрос, должен запускать сторонний сервер и возвращать его ip (сторонний сервер далее никак не связан с django).

Для этого я использовал bash скрипт с примерно следующим содержанием /pathToServerExecutable serverParams & И запускал его через os.system (или subprocess)

В итоге запрос выдает connection timeout.

Вопрос: Как правильно запускать такие отдельные процессы?

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/743880/django-rest-%d0%b7%d0%b0%d0%bf%d1%83%d1%81%d0%ba-%d1%81%d1%82%d0%be%d1%80%d0%be%d0%bd%d0%bd%d0%b5%d0%b3%d0%be-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0-%d0%b2-%d0%b1%d1%8d%d0%ba%d0%b3%d1%80%d0%b0%d1%83%d0%bd%d0%b4%d0%b5#comment1139886_743880
@Klimenkomud сторонний сервер - udp сервер написанный на c#. Он точно запускается, потому что он есть в процессах и к нему можно подключиться. Но запрос в django в это время висит. (Запускать сторонний сервер - просто запускать исполняемый файл в отдельном потоке)

Ответы - Django rest, запуск стороннего скрипта в бэкграунде / Django rest, запуск стороннего скрипта в бэкграунде

Alexey Doroshenko

26.05.2018 04:20:48

Скорее всего у вас происходит такая ситуация: subrocess.call() ожидает завершения и, соответственно, django также "зависает" на этом моменте и ожидает ответа. В вашем случае запускается сторонний сервер и пока он работает - будет ожидаться ответ.

Пример (вызов этой функции будет ожидать ответа до тех пор, пока вы не закроете firefox или он, к примеру, не "упадёт"):

import subprocess
subprocess.call("firefox")

Чтобы этого не происходило, можно, например, запустить процесс в отдельном потоке, для этого в python предусмотрен модуль threading: https://docs.python.org/3/library/threading.html

Пример запуска в отдельном потоке (естественно, можно доработать под свои нужды и передавать не только команду, но также и параметры, обрабатывать ошибки и т.д.):

import threading
import subprocess

class RunCommandThread(threading.Thread):
    """
    Класс для запуска команды в отдельном потоке
    """
    def __init__(self, command):
        self.command = command
        threading.Thread.__init__(self)

    def run(self):
        subprocess.call(self.command)

Использование:

RunCommandThread("firefox").start()
Закрыть X