【问题标题】:Python Pyramid increase request timeoutPython Pyramid 增加请求超时
【发布时间】:2018-12-12 14:02:31
【问题描述】:

我正在处理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

感谢您的帮助

【问题讨论】:

  • HTTP 的设计不是这样工作的,它假定响应总是及时可用的。也许有一个端点用于提交文件,另一个端点用于获取结果?客户端需要轮询结果端点,直到它真正获得有用的结果。也就是说,你怎么能花 10 分钟来解析一个 excel 文件?它们只能有一百万行(或类似的行),因此您最多应该能够在几秒钟内翻阅所有行

标签: python timeout pyramid


【解决方案1】:

我不认为是 Pyramid 关闭了连接,更可能是为您的应用程序提供服务的网络服务器(Apache/Nginx 等)。金字塔本身通常很乐意只要有必要就顺其自然。

我同意@SamMason 的观点,即有更好(但更复杂)的方法来正确执行长时间运行的任务,但在某些受控情况下,有一个长时间运行的请求可能会进行大量处理。我有几个迁移/维护脚本需要几个小时才能完成,效果很好。

让所有参与者(网络服务器、代理、浏览器等)满意的诀窍是确保您的应用程序返回少量数据,不要让 HTTP 连接闲置。

不幸的是,对于 Pyramid,流式请求并不完全简单,但有 some resources 可能会为您指明正确的方向。

【讨论】:

    【解决方案2】:

    正确的做法是不要在请求中执行长时间运行的任务。

    你能做的是

    • 发出初始请求以启动任务,立即返回。此请求将任务写入数据库。
    • 有一个后台工作进程(例如 Celery)来处理任务
    • 有一个前端轮询/JavaScript/重定向循环来检查后台进程是否完成了任务

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 2013-06-01
      • 1970-01-01
      • 2018-01-20
      • 2013-11-03
      • 2015-12-21
      相关资源
      最近更新 更多