使用 dev_appserver.py 在 google 应用引擎上本地测试任务队列

Testing taskqueues locally on google app engine using dev_appserver.py

我的 App Engine 应用有 2 个队列。第一个队列中的一个 worker 启动第二个队列中的几个 worker 并等待它们完成并合并。

这在我部署时工作正常,但它不起作用 在本地测试时从不在第二个队列中生成任务。它在等待更新时卡住了(请参见下面的代码)。原因好像是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
        

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

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

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