Python w/Cellery和RabbitMQ的行为不正常

Python w/Cellery和RabbitMQ的行为不正常,python,django,celery,Python,Django,Celery,我将Django 1.4.3与Python2.7、芹菜3.0.1和Ubuntu13.04上的Django芹菜3.0.17一起使用 我设置了一些任务来运行耗时的流程。如果我让他们排队吃芹菜,他们的行为就不正常了。如果我在不排队的情况下运行它们,一切都会正常运行。有没有想过为什么会出现这种情况 为我的问题提供一些动力。我需要复制公司合同。每个合同都有多个与之相关的报价。每个报价都有多个报价字段。每个报价字段都有多个值。我需要克隆一切 这是我正在做的一个例子 def clone_contract(se

我将Django 1.4.3与Python2.7、芹菜3.0.1和Ubuntu13.04上的Django芹菜3.0.17一起使用

我设置了一些任务来运行耗时的流程。如果我让他们排队吃芹菜,他们的行为就不正常了。如果我在不排队的情况下运行它们,一切都会正常运行。有没有想过为什么会出现这种情况

为我的问题提供一些动力。我需要复制公司合同。每个合同都有多个与之相关的报价。每个报价都有多个报价字段。每个报价字段都有多个值。我需要克隆一切

这是我正在做的一个例子

def clone_contract(self, contract_id, contract_name):
    old_contract = models.Contract.objects.get(pk=contract_id)
    contract_dict = dict()
    for attr in old_contract._meta.fields:
        contract_dict[attr.name] = getattr(old_contract, attr.name)
    del contract_dict['id']
    contract_dict['name'] = contract_name
    new_contract = contracts_models.Contract(**contract_dict)
    new_contract.save()
    contracts_tasks.clone_offers.delay(new_contract, old_contract)

@task(name='Clone Offers')
def clone_offers(new_contract, old_contract):
    for offer in old_contract.offer_set.all():
        offer_dict = dict()
        for attr in offer._meta.fields:
            offer_dict[attr.name] = getattr(offer, attr.name)
        del offer_dict['id']
        del offer_dict['contract']
        offer_dict['contract_id'] = new_contract.pk
        new_offer = contracts_models.Offer(**offer_dict)
        new_offer.save()
        clone_offer_fields(new_offer, offer)

def clone_offer_fields(new_offer, old_offer):
    offer_fields = models.OfferField.objects.filter(offer=old_offer)
    for offer_field in offer_fields:
        initial = dict()
        for attr in offer_field._meta.fields:
            initial[attr.name] = getattr(offer_field, attr.name)
        initial['offer'] = new_offer
        del initial['id']
        new_offer_field = contracts_models.OfferField(**initial)
        new_offer_field.save()
        model = models.OfferFieldValue
        values = model.objects.filter(**{'field': offer_field})
        clone_model(new_offer_field, model, 'field', values)

def clone_model(new_obj, model, fk_name, values):
    for value in values:
        initial = dict()
        for attr in value._meta.fields:
            initial[attr.name] = getattr(value, attr.name)
        del initial['id']
        initial[fk_name] = new_obj
        new_value = model(**initial)
        new_value.save()
从我观察到的情况来看,
clone\u offers
有效,但
clone\u offer\u字段
无效-同样,只有
clone\u offers
被称为
clone\u offers.delay()
。如果我运行这个调用
clone\u提供的
没有
.delay()
(不排队),那么一切都能正常工作

不幸的是,我无法登录排队的任务(似乎没有任何内容写入日志文件),因此无法在代码中进行故障排除

在队列任务中调用函数是否存在问题?我很确定我以前做过,没有问题。(编辑:答复如下)

如有任何建议,将不胜感激

编辑1:
我决定把所有的方法放在一起测试一下。我99%确信这不会是问题,但我认为最好检查一下以确定。如果我使用单一的大规模方法,没有区别。

问题涉及芹菜劫持默认日志记录。我实现了给定的解决方案:

在这方面没有花费太多时间,我的初步猜测是,当您对任务排队时,您会遇到非锁定(并发)问题。我的意思是,当您连续调用任务时,从数据库中获取和更改的数据将在您调用下一个任务时传播。但是,当您排列它们并分发任务时,您可能会覆盖在提交任务之前从另一个任务中提取的某些信息。我建议这样做的唯一原因是因为你正在“克隆”对象,删除属性,然后将它们保存回来。(2/2)看这个,这可能更好地解释了我想说的@Blake VandeMerwe我认为这可能是个问题。谢谢,我会进一步研究的。@Blake VandeMerwe:这似乎不是并发性的问题。我试图克隆一个项目,这将创建一个任务。它仍然不起作用。