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

我的设置中的芹菜部分.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. 使用一些日志记录来检查是否调用了您的任务。您可以使用redis或memcache或类似的东西来实现一些记账。我知道这是在检查消息代理,但它会让你验证你的任务是否确实被调用了。

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

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

相关内容

  • 没有找到相关文章

最新更新