【问题标题】:Channels and TaskQueues in Google App Engine (client debugging)Google App Engine 中的 Channels 和 TaskQueues(客户端调试)
【发布时间】:2011-02-07 05:39:53
【问题描述】:

我正在尝试构建和调试我的第一个 GAE 应用程序,并且已经从 Stackoverflowers 的强大支持中受益,从而使我能够在默认队列上处理任务。谢谢!

但是,我想使用队列来演示如何在后台执行一些“长时间”工作。我的想法是:

  1. 接收处理大文件的请求。
  2. 存储文件并将任务排入队列。
  3. 返回响应。
  4. 在后台处理文件。
  5. 通过 Channel 让客户知道工作已经完成!

我有这一切工作,但有一个问题。在我的开发服务器上,任务队列似乎没有在后台处理任务。为了模拟长时间运行的工作,我只是在那里睡觉。

def post(self):
    time.sleep(60)
    #use a channel to let the client know we're done

GAE 开发服务器似乎是单线程的。在项目从队列中处理出来之前它根本不响应?这个假设正确吗?有什么想法吗?

谢谢

添加代码示例:

#code to enqueue task
taskqueue.add(url='/processSubmission', params={'key': activity.key() }, transactional=False)

#class that processes queued work
class ProcessSubmission(webapp.RequestHandler):
  def post (self):
    time.sleep(60)
    activity = db.get(db.Key(encoded=self.request.get('key')))
    activity.approved = True
    activity.put()
    channel.send_message(activity.userid, 'Wahoo! we are done')

【问题讨论】:

  • 你能发布你的代码的相关部分吗?
  • 完成 - 添加了代码。希望这就够了。

标签: python google-app-engine task-queue channel-api


【解决方案1】:

是的,App Engine dev_appserver 是单线程的,一次只处理一个请求。但是,您的面向用户的请求应该在开始处理任务队列请求之前返回。

【讨论】:

  • 我现在已经测试了很多方法,但事实似乎并非如此。您确定它会在完成排队项目之前返回吗?如果你是对的,那么我的 Channels 示例应该可以工作(我应该注意,我尝试过更简单的设置)
  • @ConfusedNoob 是的 - 任务与用户请求异步运行。请注意,dev_appserver 上的 Channel API 使用轮询,但轮询请求在您的任务执行完成之前不会通过 - 也许这就是您观察到的原因?
  • 这可以解释为什么整个场景不能正常工作,但不能解释为什么需要 60 秒才能完成任务的响应......
  • 好的,我已经对此进行了更多研究,在我的所有实验中,似乎将任务排入队列的页面在任务完成处理之前没有响应。这甚至在 HTTP 级别(通过跟踪工具)。仅在处理完任务后才开始返回响应。这感觉像是一个非常糟糕的开发故事 - 有什么解决方法或建议吗?
  • @ConfusedNoob 你确定你运行的是最新的 SDK 吗?如果我没记错的话,旧版本会执行这样的任务。尝试重新安装您的 SDK。
猜你喜欢
  • 1970-01-01
  • 2013-11-05
  • 2013-10-21
  • 2019-03-08
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多