0

Ubuntu 13.04でPython 2.7、Celery 3.0.1、およびdjango-celery 3.0.17でDjango 1.4.3を使用しています。

時間のかかるプロセスを実行するために、いくつかのタスクをセットアップしています。セロリでキューに入れるように設定すると、正しく動作しません。それらをキューに入れずに実行すると、すべてが完全に動作します。なぜこれが当てはまるのかについての考えはありますか?

私の問題に何らかの動機を与えるため。会社の契約を複製する必要があります。各契約には、複数のオファーが関連付けられています。各オファーには複数のオファー フィールドがあります。各オファー フィールドには複数の値があります。すべてを複製する必要があります。

これが私がやっていることの例です。

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_offers作品はそうでclone_offer_fieldsはありません-再度、clone_offersとして呼び出された場合のみclone_offers.delay()。この呼び出しclone_offers.delay()(キューに入れずに) 実行すると、すべてが完全に機能します。

残念ながら、キューに入れられたタスクにログインできない (ログ ファイルに何も書き込まれていないように見える) ため、コード内でトラブルシューティングを行うことはできません。

キューに入れられたタスク内で関数を呼び出す際に問題はありますか? 私は問題なくこれを以前に行ったことがあると確信しています。(編集:以下に回答)

どんな提案でも大歓迎です。

EDIT1:すべてのメソッドを一緒にスローしてこれをテストすることにしました。私はこれが問題ではないことを 99% 確信していましたが、確認するために確認したほうがよいと思いました。単一の大規模な方法を使用しても違いはありません。

4

1 に答える 1

0

この問題には、Celery がデフォルトのロギングをハイジャックすることが含まれていました。与えられたソリューションを実装しました: Django Celery Logging Best Practice

于 2013-08-28T20:54:25.113 に答える