芹菜任务执行不正确

时间:2014-04-12 17:48:51

标签: python django celery django-celery

我在网络游戏中使用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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

两个建议:

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

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

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