【问题标题】:HTTP POST on app engine without waiting for result应用引擎上的 HTTP POST 无需等待结果
【发布时间】:2014-07-07 10:22:48
【问题描述】:

目前花费大量实例时间等待我发送到 Facebook 的 HTTP POST 完成,即使我实际上什至没有查看这些 POST 的结果(我正在这样做以执行用户已安排的页面帖子通过我的应用程序)。

即使在异步 urlfetch 中,the docs say:

如果请求处理程序退出时任何 URL Fetch 请求处于待处理状态, 应用程序服务器等待所有剩余的请求 在对 用户。

有没有一种方法可以让我在不等待结果的情况下进行 POST?

这在Asynchronous URLfetch when we don't care about the result? [Python] 之前被问过一次,但这些答案很古老,现在可能有一些直接的方法吗?

【问题讨论】:

  • 我目前正在考虑将它们放在 memcached 中的某个队列中,然后每分钟一次将它们与异步 urlfetch 并行执行一次,但也许有更好的方法。
  • 实例时间不用于构建响应,它们用于执行实际的 POST。因此,它们是您的流程所必需的计算时间。您可以将任务发送到任务队列,这样用户就不必等待,但 POST 仍然会占用 CPU 和写入时间。
  • 但是在实际 POST 中发生的是请求形成,连接打开,请求内容写入套接字,然后应用引擎开始等待响应进来。我会没事的不等待响应。
  • 我认为有些混乱。 “等待响应进来”的时间是 CPU 时间,服务器正在执行您要求的工作。无论您是否在等待回复,您都需要为那段时间付费。构建响应和实际响应的时间非常短。
  • 啊,我一定是有点模棱两可。我是向 Facebook 发送请求的人。我不提供 POST,我正在发送它们。

标签: google-app-engine


【解决方案1】:

【讨论】:

    【解决方案2】:

    我会实现一个任务队列。这允许请求在项目插入队列后完成,用户不必等到进程完成。编写您的请求处理程序并记住使用queue.yaml 文件配置您的队列

    请求处理程序

    import webapp2
    from google.appengine.api import taskqueue
    
    class Request_Handler(webapp2.RequestHandler):
        def post(self):
            queue = taskqueue.Queue('queue-name')
            task = taskqueue.Task(url='/queue/url', params={'key': value})
            queue.add(task)
            self.response.out.write('success')
    

    queue.yaml

    queue:
    - name: queue-name
      rate: 5/s
      bucket_size: 1
      max_concurrent_requests: 1
    

    【讨论】:

    • 其实这已经是一个任务队列任务,所以没有用户等待它完成。我担心的是,例如,POST 是否需要 30 秒才能完成,如果我没记错的话,我会为这 30 秒的实例时间付费(总计约 180 美元/月)。我不想等待,因为我不需要结果。谢谢!
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多