【问题标题】:Task queue: Allow only one task at a time per user任务队列:每个用户一次只允许一个任务
【发布时间】:2015-03-04 07:27:00
【问题描述】:

在我的应用程序中,我需要一次只允许每个用户执行一项任务。我看到我们可以在queue.yaml 中设置max_concurrent_requests: 1。但这将在队列中一次只允许一个任务。

当用户单击按钮时,将启动一个任务,并将 50 个任务添加到队列中。如果 2 个用户几乎同时单击该按钮,总任务数将为 100。如果我给 max_concurrent_requests: 1,它将只运行这些用户中的任何一个的一个任务。

我该如何处理这种情况?

【问题讨论】:

  • 尚不清楚您要在这里实现什么。如果您设置 max_concurrent_requests: 1 并添加 2 批 50 个任务,它们将按队列定义中指定的速率和入队顺序一次执行一个。任务队列没有用户的概念。如果您想了解队列中有多少任务,请尝试Queue.fetch_statistics()

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


【解决方案1】:

您可以在 queue.yaml 中指定任意数量的队列,而不仅仅是使用默认的推送队列。如果您认为一次最多可能有五个用户竞争同时使用它们,那么只需定义五个队列。拥有一个增加 1 并在超过 5 时返回 1 的全局计数器。使用它来分配给定用户在请求时将他或她的任务推送到哪个队列。使用这种方法,当您有六个或更多用户同时添加任务时,您的情况不会比现在差(事实上,可能要好得多)。

如果您发现服务器超载,请在必要时将部分或全部队列的默认“速率:5/s”降低到较低的值,但首先尝试降低存储桶大小,因为降低速率当没有多个用户时,会减慢速度。就个人而言,如果您遇到无法通过调整存储桶大小来解决的性能问题,我会首先尝试仅关闭四个添加的队列并让第一个队列快速解决此问题。

【讨论】:

  • @tx802 是的,您的评论让我意识到,简单地循环排队有点愚蠢。我会依次获取每个队列的统计信息,直到找到一个空队列。如果没有一个是空的,我会使用负载最少的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2015-03-12
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 2015-04-11
相关资源
最近更新 更多