芹菜任务执行不正确

2024-06-26 13:10:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个网络游戏里用芹菜和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()

这项任务交付了这艘船,解放了造船厂。你知道吗

我不断收到偶尔的报告,用户遇到船厂堵塞和船只失踪超过预计到达时间,在我的一生中,我不知道为什么!我已经设置了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

有人能帮忙吗?你知道吗


Tags: 用户worldsavedef时间amountcelery芹菜
1条回答
网友
1楼 · 发布于 2024-06-26 13:10:50

两条建议:

  1. 使用一些日志来检查任务是否被调用。您可以使用redis或memcache或类似的工具来实现一些簿记。我知道这有点像是在检查messagebroker,但它会让您验证是否确实调用了任务。

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

    世界=World.objects.get(worldid=worldno) 为您带来旧的结果,因为它是用于一些现有的事务。试着把你得到的打印出来,来确认是否是这样。您可以通过在读取之前尝试写入来强制执行新事务。请注意,如果数据库连接空闲时间过长,Django1.6可能会出现问题。

相关问题 更多 >