Python Pyramid увеличить время ожидания запроса - PullRequest
0 голосов
/ 12 декабря 2018

Я работаю над Python Pyramid rest api и в одном из запросов мне нужно обработать Excel, и для каждой его строки я получаю GPS-координаты и много проверяю, этоозначает, что этот единственный запрос может занять около 10 минут, и мне нужно вернуть ответ вызывающей стороне с помощью JSON.Я не могу отправить через WebSocket что-либо еще.

Мой вопрос: как мне увеличить время ожидания для этого запроса?Это мой метод:

@view_config(route_name='client_api_upload',
             request_method='POST',
             renderer='json',
             permission='upload client')
def client_api_upload(request):

    client_id = request.POST['client_id']
    filename = request.POST['file'].filename
    input_file = request.POST['file'].file
    extension = os.path.splitext(filename)[1]
    new_file_name = str(uuid.uuid4())+extension
    file_path = os.path.join(tempfile.gettempdir(), new_file_name)

    with open(file_path, 'wb') as output_file:
        shutil.copyfileobj(input_file, output_file)

    importer = ClientBuildingImporter(client_id=client_id, db_session=request.dbsession)
    importer.import_building_from_excel(excel_file_path=file_path)

    return importer.import_result

Спасибо за любую помощь

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Правильный подход состоит в том, чтобы не выполнять долго выполняющиеся задачи в запросах.

Что вы можете сделать, это

  • Сделать первоначальный запрос, чтобы запустить задачу, немедленно возвращается.Этот запрос записывает задачу в базу данных.
  • Наличие фонового рабочего процесса (например, Celery) для обработки задач
  • Наличие внешнего цикла опроса / JavaScript / перенаправления для проверки наличия фонового процессавыполнил задание
0 голосов
/ 13 декабря 2018

Я не думаю, что пирамида закрывает соединение, скорее всего, это веб-сервер (Apache / Nginx и т. Д.), Который обслуживает ваше приложение.Сама пирамида обычно рада просто пыхтеть, пока это необходимо.

Я согласен с @SamMason, что есть лучшие (но более сложные) способы правильного выполнения долгосрочных задач, но в некоторых контролируемых обстоятельствахможет быть хорошо иметь длительный запрос, который выполняет большую часть обработки.У меня было несколько сценариев переноса / обслуживания, которые занимали часы, чтобы закончить, работали просто отлично.

Хитрость для того, чтобы все участники (веб-сервер, прокси, браузер и т. Д.) Были довольны, это убедиться, что естьструйка данных, возвращаемых вашим приложением, не позволяйте HTTP-соединению просто бездействовать.

В Pyramid, к сожалению, потоковые запросы не совсем просты, но есть некоторые ресурсов , которые могут указать вам правильное направление.

...