我的应用引擎应用有2个队列。来自第一个队列的工作人员在第二个队列中启动多个工作人员并等待他们完成并合并。
我部署它时工作正常,但不起作用在本地测试时永远不会产生第二个队列中的任务。它在等待更新时卡住(参见下面的代码)。原因似乎是dev_appserver是单线程的,并且不在后台启动服务。
这实际上是在减慢我的开发速度,因为我必须部署到云来测试任何东西。
有什么方法吗?
编辑:在下面添加(种类)伪代码。同样,这在云中运行得非常好,因为我有10分钟的时间限制来完成任务,每个BigTask
完成任务的时间不会超过30-40秒。
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
class SmallTask(webapp2.RequestHandler):
def do_stuff(self):
# Do processing
# Update ndb entry
# done
答案 0 :(得分:2)
一般睡在GAE应用程序代码中并不是一个好主意 - 浪费实例正常运行时间,增加请求延迟,超出请求截止日期的风险等。
您可以通过将延迟BigTask(使用countdown
选项)排入队列以检查所有较小任务的状态来实现相同的功能,如果已完成add_results(...)
内容,则执行相同功能,如果没有,重新排队(再次延迟)以便稍后重新检查。
作为副作用,您甚至可以对两种任务使用相同的任务队列(当然,如果这与您的应用程序要求一致)。