2017-10-27 18 views
0

Ich habe eine Aufgabe, die bei jeder Verarbeitung einer neuen Aufgabe einen Aufgabenverlaufs-Datensatz erstellt. Ich instanziiere eine neue TaskHistory-Instanz am Anfang der Task-Funktion. Aus irgendeinem Grund werden TaskHistory-Klassenattributen, die in einer vorherigen Aufgabe zugewiesen wurden, den TaskHistory-Klassenattributen in nachfolgenden Aufgaben zugewiesen. Wenn zum Beispiel die Aufgabe zuweisen gelingt I:Sellerie-Task weist lokalen Instanzattributen in nachfolgenden Tasks zu

task_history.meta['success'] = 'Successfully processed {} rows '.format(row_count)' 

In einer nachfolgenden Aufgabe es scheitern könnte und ich zuweisen:

task_history.meta['error'] = 'Processed {} rows '.format(row_count) + str(e) 

Die anschließende Aufgabe nur Meta [ ‚error‘] zuweisen sollte, aber es ist die Zuordnung der vorherige meta ['success'] -Wert auch, obwohl die task_history wiederhergestellt wurde.

Unten ist der Code, der die Aufgabe aufruft:

args = [file_ids] 
kwargs = {'requester': request.user.profile} 
csv_import.apply_async(args=args, kwargs=kwargs) 

Unten ist die Aufgabe Funktion:

@task 
def csv_import(file_ids, requester=None): 
    task_history = TaskHistory() 
    task_history.requester = requester 
    task_history.status = 'pending' 
    task_history.started = timezone.now() 
    task_history.save() 
    row_count = 0 
    try: 

     //main logic goes here 

     task_history.status = 'completed' 
     task_history.completed = now() 
     task_history.meta['success'] = 'Successfully processed {} rows '.format(row_count) 
     task_history.save() 
    except Exception as e: 
     task_history.status = 'failed' 
     task_history.completed = timezone.now() 
     task_history.meta['error'] = 'Processed {} rows '.format(row_count) + str(e) 
     task_history.save() 
     raise Exception 

Antwort

0

Am Ende dieses nichts mit Sellerie zu tun hatte, sondern mit der Art, wie ich die eingestellte Standardwert für mein Metafeld in meinem Modell. Das Meta-Feld ist ein JSONfield() und ich setze den Standardwert auf default = {}, die eine veränderbare Instanz erstellt und zwischen allen Instanzen von JSONfield geteilt wird. Ich habe dies behoben, indem ich es auf eine aufrufbare dict gesetzt habe. Das neue Feld erscheint nun wie folgt:

meta = JSONField(default=dict) 

Weitere Informationen zu diesem hier https://docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/#jsonfield werden kann. Dies ist derselbe Standard, der für alle Modellstandardwerte verwendet werden sollte.

Verwandte Themen