【问题标题】:Testing taskqueues locally on google app engine using dev_appserver.py使用 dev_appserver.py 在谷歌应用引擎上本地测试任务队列
【发布时间】:2016-10-18 03:26:19
【问题描述】:

我的应用引擎应用有 2 个队列。来自第一个队列的工作人员在第二个队列中启动多个工作人员并等待他们完成和合并。

当我部署它时它工作正常,但它不起作用在本地测试时从不产生第二个队列中的任务。它在等待更新时卡住了(见下面的代码)。原因似乎是 dev_appserver 是单线程的,不会在后台启动服务。

这真的减慢了我的开发速度,因为我必须部署到云端来测试任何东西。

有什么办法吗?

编辑:在下面添加(某种)伪代码。同样,这在云中工作得非常好,因为我有 10 分钟的时间限制来完成任务,每个 BigTask 需要不超过 30-40 秒来完成。

队列 1 工作人员

class BigTask(webapp2.RequestHandler):
  def do_stuff(self):
    #do something here
    small_task1 = taskqueue.add(...)
    small_task2 = taskqueue.add(...)
    small_task3 = taskqueue.add(...)
    small_task4 = taskqueue.add(...)
    # Create ndb entries for all small tasks
    
    while True:
      time.sleep(2)
      # Check if ndb entry updated for all small_tasks
      if status == 'Completed': #for all
        break
    
    add_results(...) # of all tasks here
    
    # Update ndb entry for big_task
    # done

队列 2 工作人员

class SmallTask(webapp2.RequestHandler): 
  def do_stuff(self):
    # Do processing
    # Update ndb entry
    # done
        

【问题讨论】:

  • 推送队列对我来说工作得很好,你可能会遗漏一些东西。详情?
  • @DanCornilescu - 是的,我正在使用推送队列。我认为主要原因是因为一个队列中的工作人员正在启动另一个队列中的工作人员,正在睡觉,并等待另一个队列中的工作人员完成然后聚合值。所以我的新任务命令不是处理程序中的最后一条语句。希望这是有道理的!
  • 睡在 GAE 应用程序中通常不是一个好主意。代码?
  • 添加了代码。嗯,您是否建议我删除睡眠并创建第三个拉取队列来最终确定数据?我想过,但似乎过于复杂了。
  • 您可以将延迟的 BigTask 排入队列以检查所有较小任务的状态,而不是睡眠,如果它们已完成,请执行 add_results(...) 的内容,或者重新排队(延迟)以稍后重新检查。这样你就可以为所有任务使用一个队列。

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


【解决方案1】:

通常在 GAE 应用程序代码中休眠不是一个好主意 - 浪费实例正常运行时间、增加请求延迟、超过请求截止日期的风险等。

您可以通过将延迟的 BigTask 排入队列(使用 countdown 选项)来实现相同的功能,该任务将检查所有较小任务的状态,如果它们已完成则执行 add_results(...) 内容,否则,重新排队本身(再次延迟)稍后再检查。

作为副作用,您甚至可以为这两种任务使用相同的任务队列(当然,如果这符合您的应用要求)。

【讨论】:

  • 是的,我使用了同一个队列并添加了一个额外的参数来查看它是否正在等待加入来自另一个队列的任务。
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 2013-09-04
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多