감사합니다 :)장고와 셀러리 : 피클 작업을 사전에
에없는 나는이 비동기 셀러리 작업 호출이 있습니다
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 전달에 대한 의견이 고정되었습니다. 그것은 어디서나 개체 그래프에있을 수 있도록
경쟁 조건을 피하고 페이로드 크기를 줄이려면 모델 인스턴스가 아닌 모델 PK를 전달하는 것이 좋습니다. – AndrewS
완전히 맞지만 문제가 해결되지는 않습니다. – hamsterdam
오브젝트 내의 *는 인스턴스 메소드입니다 (즉, Object.foomethod를 사전에 넣거나 비슷한 이름으로). pickle이 피클을 피클 할 수없는 장소에 놓습니다. –