2012-09-06 130 views
0

我使用python 2.7和django 1.27,我使用芹菜任務。django通過當地人()芹菜任務

我有這種說法

def my_view(request): 
    do_stuff() 
    local_1 = 1 
    local_2 = 4 
    celery_delayed_task(locals()) 
    return HttpResponse('OK') 

這導致了這個錯誤時拋出

Passing locals() fails: a class that defines slots without defining getstate cannot be pickled

所以我想也許我需要創建當地人的副本()字典,因爲任務將被調用時,該視圖不再存在。

我試試這個:

def my_view(request): 
    do_stuff() 
    local_1 = 1 
    local_2 = 4 
    locals_dict = copy.deepcopy(locals()) 
    celery_delayed_task(locals_dict) 
    return HttpResponse('OK') 

,現在我得到這個錯誤:

Deepcopy of object fails: object.new(cStringIO.StringO) is not safe, use cStringIO.StringO.new()

顯然我這樣做不對,有什麼想法?

回答

1

任務參數必須被序列化。

Celery默認使用Python pickle協議,但也支持json,yaml,msgpack或自定義序列化器。

您嘗試發送的對象不能被醃漬。你有可能讓它們變成可以醃製的,但是在最後傳遞的當地人中,作爲任務參數不是一個好習慣。

參見:http://docs.python.org/library/pickle.html