django - 将特定组的 Django 用户设置为 celery worker
问题描述
我需要让一组特定的 Django 用户(组:送货员)作为芹菜工人。每当来自该特定组的任何注册 django 用户登录时,他们都可以从 celery 队列中选择任务并完成。一旦一个用户完成一项任务,它就必须从队列中出列,并且异步它不应该对该组中的下一个登录用户可见。
解决方案
正如@Anup Yadav 所说,Celery 不适合这个用例。将您的任务存储在数据库中工作正常,您只需要锁定行使用select_for_update
以确保不能选择两次任务。像这样的东西应该工作:
class Task(models.Model):
is_available = models.BooleanField(default=True)
def pick_task():
"""
Selects a task and marks it as unavailable.
Returns Task or None, if no Task is available.
"""
task = Task.objects.select_for_update().filter(is_available=True).first()
if task is not None:
task.is_available = False
task.save()
return task
检查用户是否拥有正确的组将在视图中完成。请注意,这pick_task
可能应该是自定义管理器的一种方法。
推荐阅读
- excel - 使用表格最后一列中最后一个单元格的值来触发宏 vba
- mysql - 在nodejs中正确插入mysql?
- math - 我想获得三个变量的不同值列表,这些变量加起来为 1,增量为 0.05
- aws-lambda - 为什么我不能等待对 LambdaHelper.callAsync 的调用?
- php - PHP 运行了两次
- command-line-interface - 1Password CLI (op): 无法让 `--session` 标志与任何命令一起使用
- android - 如何在 onBindViewHolder() 中调整 ViewHolder 的高度?
- javascript - 在字符串Javascript中获取对象的名称
- python - 如何使用 Python 中的类制作快速查找算法并返回列表集作为结果
- javascript - 单击 Chrome 扩展程序的浏览器操作时将文本复制到剪贴板