【问题标题】:Celery Tasks executing incorrectly芹菜任务执行不正确
【发布时间】:2014-04-12 17:48:50
【问题描述】:

我在一个在线游戏中使用 Celery 和 Django。用户建造各种类型的船,并设置任务在一定时间后交付。

举个例子:

def buildfighter(world, amount):
    world.shipyardsinuse = F('shipyardsinuse') + 1*amount
    world.save()
    newtask.buildfighter.apply_async(args=(world.worldid,amount), eta=outcometime)

还有我的实际任务代码,将在 1 小时后执行:

def buildfighter(worldno, amount):
    world = World.objects.get(worldid=worldno)
    world.fighters = F('fighters') + amount
    world.shipyardsinuse = F('shipyardsinuse') - 1*amount
    world.save()

任务交付这艘船并解放造船厂。

我不断收到偶尔的用户报告,称他们在 eta 后遇到了造船厂受阻和船只丢失的情况,而我终其一生都无法弄清楚原因!我已经设置了 celerycam,当我回去检查那些丢失的任务时,它们都显示为SUCCEEDED

我的 settings.py 中的芹菜部分:

import djcelery
djcelery.setup_loader()

BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_IMPORTS = ("wawmembers.tasks", )
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'
CELERY_TASK_RESULT_EXPIRES = 14400
CELERY_DISABLE_RATE_LIMITS = True

谁能帮忙?

【问题讨论】:

    标签: python django celery django-celery


    【解决方案1】:

    两个建议:

    1. 使用一些日志记录来检查您的任务是否被调用。您可以使用 redis 或 memcache 或类似的东西并实现一些簿记。我知道这是一种检查消息代理的方式,但它可以让您验证您的任务确实被调用了。

    2. 可能是你的数据库查询

      world = World.objects.get(worldid=worldno) 给你带来旧的结果,因为它使用了一些现有的事务。尝试打印你得到的东西以验证是否是这种情况。您可以通过在阅读之前尝试写入来强制执行新事务。请注意,如果您的数据库连接空闲时间过长,django 1.6 可能会出现问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2017-09-18
      • 2021-12-16
      • 2022-01-21
      • 1970-01-01
      • 2020-10-07
      • 2017-04-11
      相关资源
      最近更新 更多