2013-08-15 5 views
3

감사합니다 :)장고와 셀러리 : 피클 작업을 사전에

에없는 나는이 비동기 셀러리 작업 호출이 있습니다

ID가 정수와 컨텍스트는 파이썬 딕셔너리입니다
update_solr.delay(id, context) 

.

@task 
def update_solr(id, context): 
    clip = Clip.objects.get(pk=id) 
    clip_serializer = SOLRClipSerializer(clip, context=context) 
    response = requests.post(url, data=clip_serializer.data) 
clip_serializer.data가 딕셔너리입니다

url이 URL을 나타내는 문자열은 다음과 같은

내 작업 정의가 보인다. 내가 update_solr.delay()를 호출 할 때

, 나는이 오류를 얻을 : 작업에 대한 인수의

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 

둘은 인스턴스 메소드가 그래서 혼란 스러워요입니다.

작업 코드가 동 기적으로 실행될 때 오류가 발생하지 않습니다.

업데이트 : 개체 대신 pk 전달에 대한 의견이 고정되었습니다. 그것은 어디서나 개체 그래프에있을 수 있도록

+1

경쟁 조건을 피하고 페이로드 크기를 줄이려면 모델 인스턴스가 아닌 모델 PK를 전달하는 것이 좋습니다. – AndrewS

+0

완전히 맞지만 문제가 해결되지는 않습니다. – hamsterdam

+0

오브젝트 내의 *는 인스턴스 메소드입니다 (즉, Object.foomethod를 사전에 넣거나 비슷한 이름으로). pickle이 피클을 피클 할 수없는 장소에 놓습니다. –

답변

3

context DICT 나를 모르는 그것의 개체, ...

를 해결하려면 있었다, 나는 비동기 호출하기 전에 context에 따라 코드를 실행하고 단지 네이티브 유형과 DICT 통과 :

@task 
def update_solr(data): 
    response = requests.post(url, data=data) 

이 만드는 유일한 목적은이 비동기 작업이 있기 때문에 완벽하게 정상적으로 밖으로 작동 :

def post_save(self, obj, created=False): 
    context = self.get_serializer_context() 
    clip_serializer = SolrClipSerializer(obj, context=context) 
    update_solr.delay(clip_serializer.data) 

작업은 다음과 같이 결국 POST를 비 차단으로 만듭니다.

도움 주셔서 감사합니다.

0
import pickle 
class X: 
    def y(self): 
     pass 

pickle.dumps(X.y) 

피클은 재귀 적으로 작동합니다. 당신은 해결책을 받았다 - Django 모델 객체 대신에 최소한의 객체들, 즉 기본 키들만을 전송한다.

+1

나는 여전히 같은 오류가 발생했습니다. 나는 갱신 할 것이다. – hamsterdam

1

모델 인스턴스 기본 키 (pk)를 전달해보십시오. 이것은 피클 링 (pickle)이 훨씬 간단하고, 페이로드를 줄이고 경쟁 조건을 피할 수 있습니다.

+0

완료. 같은 오류. – hamsterdam

+0

죄송합니다 - 당신이 말한 줄 알았는데 ;-) 셀러리없이 방법을 실행 했습니까? – AndrewS

+0

나는 그것을 얻었다, 나의 대답을보십시오. – hamsterdam

관련 문제