2014-04-12 206 views
0

我在一个在线游戏中使用芹菜和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,并为我的生活我不明白为什么!我已经建立了芹菜摄影机,当我回去检查那些失踪的任务时,他们都显示为SUCCEEDED

我settings.py的芹菜部分:

import djcelery 
djcelery.setup_loader() 

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

谁能帮助?

回答

0

两个建议:

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

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

    世界= World.objects.get(的WorldID = worldno) 带给您老的效果,因为它使用了一些现有的事务。试着打印一下你得到的结果,以验证是否属实。您可以在阅读之前尝试写入来强制新的事务。请注意,如果您的数据库连接闲置时间过长,django 1.6可能会出现问题。