2017-10-27 5 views
0

新しいタスクが処理されるたびにタスク履歴レコードを作成するタスクがあります。タスク関数の先頭に新しいTaskHistoryインスタンスをインスタンス化します。何らかの理由で、前のタスクで割り当てられたTaskHistoryクラスの属性が、後続のタスクでTaskHistoryクラスの属性に割り当てられています。それが失敗する可能性があり、後続のタスクでセロリタスクが後続のタスクでローカルインスタンス属性を割り当てています

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

を、私は割り当て:タスクが成功した場合たとえば、私が割り当て

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

、後続タスクは唯一のメタ[「エラー」]割り当てる必要がありますが、それは割り当てていますtask_historyが再インスタンス化されたとしても、以前のmeta ['success']の値になります。以下は

タスクを呼び出すコードです:以下

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

は、タスク機能さ:

@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 

答えて

0

終わり、これはセロリと私は設定の方法とは何の関係もありませんでしたモデルのメタフィールドのデフォルト値。メタフィールドはJSONfield()です。デフォルト値はです。デフォルト= {}は可変インスタンスを作成し、JSONfieldのすべてのインスタンスで共有されます。私はこれをcallable dictに設定して修正しました。以下のように新しいフィールドが表示されるようになります。このことについて

meta = JSONField(default=dict) 

詳しい情報はこちらをhttps://docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/#jsonfield見つけることができます。これは、すべてのモデルのデフォルト値に使用される標準と同じです。

関連する問題