Как сохранить экземпляр cmd=subprocess.popen(), чтобы при последующем GET/POST он мог выполнять соответствующие вызовы (например, cmd.poll, cmd .stdout.readline() и т. д.
Я пробовал использовать диспетчер сеансов Django, но всплывающий объект не подлежит сериализации Json.
Обновить< /h1>
Как предложено в комментариях, вместо того, чтобы пытаться сохранить всплывающий объект, я просто продолжаю поток после возврата запроса и сохраняю строки стандартного вывода в сеансе.
Но у меня возникла проблема с обновлением объекта сеанса после того, как запрос уже вернулся. Кажется, он обновляется, но при следующем запросе объект сеанса не содержит ни одной записи, добавленной после завершения запроса.
Вот код (
Код: Выделить всё
views.py). Я использую
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
Код: Выделить всё
import threading
from os.path import expanduser
from rest_framework.decorators import api_view
from rest_framework.response import Response
import subprocess
# Separate thred to continue running our external task
def monitor_task(cmd, session):
print('running thread')
session['stdout'] = []
while True:
line = cmd.stdout.readline()
print('line: ', line.replace('\n', ''))
if not line:
print('breaking')
break
session['stdout'].append(line.replace('\n', ''))
print(session['stdout'])
print('task is ending')
@api_view(['GET'])
def run_ngen(request):
if request.method == 'GET':
cmd = subprocess.Popen([expanduser("~/testSpawn.sh"), "10"], shell=False, bufsize=-1,
encoding='utf-8',
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
x = threading.Thread(target=monitor_task, args=(cmd, request.session,))
x.start()
return Response('request started')
@api_view(['GET'])
def get_output(request):
# GEt the output that was put into the session by monitor_task
print('session: ', request.session.items())
stdout = request.session['stdout']
print('There are', len(stdout), 'lines')
print(stdout)
return Response(stdout)
Код: Выделить всё
#!/bin/bash
sleep=5
if [ -n "$1" ]
then
sleep=$1
fi
echo line1
echo line2
echo an error 1>&2
echo Sleeping for $sleep seconds
sleep $sleep
echo line3
echo another error 1>&2
echo line4
Поток, выполняющий внешнюю задачу, похоже, работает нормально и добавляет в сеанс все 5 строк.
[img]https://i.sstatic .net/pzIUTzsf.png[/img]
Однако, когда я нажимаю конечную точку get_output, которая должна возвращать содержимое стандартного вывода, отображаются только первые 3 строки ( перед сном)

Подробнее здесь: https://stackoverflow.com/questions/785 ... -webserver