使用 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(...)
操作,或者,如果不,重新排队(再次延迟)以稍后重新检查。
作为副作用,您甚至可以为两种任务使用相同的任务队列(当然,如果这符合您的应用要求)。
我的 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(...)
操作,或者,如果不,重新排队(再次延迟)以稍后重新检查。
作为副作用,您甚至可以为两种任务使用相同的任务队列(当然,如果这符合您的应用要求)。