【发布时间】: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