LINUX.ORG.RU

Как правильно ответиться во view в Django, что бы в фоне запустить процесс?

 , , ,


1

1

Привет всем!

Подскажите кто сможет что делать с такой проблемой?

Использую Debian + Nginx + Django + UWSGI, во view одна из функций делает fork(), другой процесс ответвляется, с ним никаких проблем нет (он так и остаётся висеть в фоне слушая сокет, как задумано), после сразу идёт return render(request, ... для родительского процесса. Проблема в том, что после ответвления не прогружается сразу страница, идёт долгая загрузка и всё кончается ошибкой «Веб-страница недоступна». Если я её просто обновляю, то она прогружается нормально, так как кнопка не нажата, «start» в запросе тоже нет, ответвления не происходит. Пробовал и через multiprocessing, то же самое.

def func(request):   
    status = False
    if 'start' in request.POST:
        p = Process(target=server.startServer, args =(request.POST['typeMon'],)).start()
        status = True
    return render(request, 'test.html', { 'serverStatus': status })

Что я смог понять это то что вроде как запускается ещё один worker в uwsgi, и кажется ожидается что он может быть должен вернуть return из этого нового процесса, а потом по таймауту, так как там ничего не возвращается, он убивается и появляется ошибка. Ну это всё мои додумки, как точно всё работает, я не понимаю..

Решения проблемы не нашёл, стал пробовать запускать не через fork():

os.popen('python' + ' ' + os.path.join(BASE_DIR, 'server.py')+ ' ' + request.POST['typeMon'])
os.system('python' + ' ' + os.path.join(BASE_DIR, 'server.py')+ ' ' + request.POST['typeMon'])
os.execlp('python', 'python',os.path.join(BASE_DIR, 'server.py') , request.POST['typeMon'])
os.spawnv(os.P_NOWAIT, sys.executable, ('python', os.path.join(BASE_DIR, 'server.py'),request.POST['typeMon'] ))

(spawnv при этом почему то работает на встроенном в django веб-сервере а на рабочем выдаёт в лог uwsgi ошибку unable to load configuration from ...server.py)

Ни к чему это не привело, так же не срабатывает return, идёт долгая загрузка. Что-то можно с этим сделать? Так остался один вариант, не из Django запускать, а просто с консоли в фоне...

На тестовом сервере джанговском при всём при этом всё работает нормально. HELP!

Ответ на: комментарий от Deleted

Я хочу иметь возможность с веб страницы делать старт, стоп, рестарт моему процессу через сокет, без захода на консоль

badtrips
() автор топика
Ответ на: комментарий от Deleted

Управлять в общем процессом как нужно будет

badtrips
() автор топика
Ответ на: комментарий от badtrips

Я не знаю что тебе надо конкретно.
Я что-то сути не уловил.

FIL ★★★★
()

Подтверждаю про селери.
Джанга это веб-фреймворк, они не рассчитан на такое.
Но селери это инструменет, который может взять задание в очередь и выполнить его независимо от веба.
В данном случае очевидно надо ставить задание на выполнение ответвляющейся функции перед рендером.

Goury ★★★★★
()

Ну и в крайнем случае, если оч боишься селери, можно написать своего маленького демона, который будет лазить в очередь заданий и выполнять их оттуда. Соответственно перед рендером пишешь в БД/файл/сокет/куда-ещё-там, а демон читает оттуда и выполняет что написано.
Это пусть и велосипед, но хотя бы каноничный.

Goury ★★★★★
()
Ответ на: комментарий от Goury

Джанга это веб-фреймворк, они не рассчитан на такое.

Спасибо, буду пробовать и не делать Джангой то, для чего она не предназначена.

badtrips
() автор топика
Ответ на: комментарий от FIL

Ой, чет в глаза долблюсь. Впрочем, без меня все разжевали.

Deleted
()

Возможно несколько причин «странностей» при запуске внешних комманд из-под вебсервера (например, утечка декрипторов в дочерние потоки). Я бы попробовал через subprocess.Popen(shlex.split(cmd), close_fds=True), у меня такое обычно работает.

Всякие celery это оверкилл.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

subprocess.Popen(shlex.split(cmd), close_fds=True)

subprocess как и os.spawnv почему-то в логи uwsgi даёт ошибку unable to load configuration from <запускаемый файл>

badtrips
() автор топика
Ответ на: комментарий от true_admin

Но на тестовом встроенном в Джангу веб-сервере всё работает как надо =0.

badtrips
() автор топика
Ответ на: комментарий от true_admin

Да, с close_fds, и с той ссылки и начал поиски, uwsgi всё равно пишет unable to load configuration from.

Может что-то не так в yaml. Направление я в принципе понял, если таки можно так запустить новый процесс и не завершать его, что бы отработал return, буду штудировать документацию.

badtrips
() автор топика

Не надо так делать. Боль боль кладбище слёзы. Не делай так.

anonymous
()
Ответ на: комментарий от anonymous

А uwsgi дикий комбайн уровня апача.

В лучших традициях JAVA EE, и это прекрасно. Причем в задаче он уже есть.

anonymous
()
Ответ на: комментарий от anonymous

Два чая.

Небо не видело настолько толстой и бесполезной поделки. Хотя нет. Видело.

redixin ★★★★
()
Ответ на: комментарий от ei-grad

И что это даст? Какую проблему решит? Разве избавит от простающего проца.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.