2017-10-31 6 views
0

저는 셀러리가 처음 인 사람입니다. 내 셀러리 작업 중 하나는 다른 모든 작업이 완료된 후에 시작해야한다는 요구 사항이 있습니다. 나는 그걸 가지고 놀았고 또한 온라인으로 도큐먼트를 찾았는데, 내가 정확히 이해할 수없는 groupschords 등을 사용해야한다고 지적했다.다른 모든 작업을 마친 후에는 셀러리 작업이 필요합니다.

나는 또한 SO here의 또 다른 질문을 올렸지 만 지금까지 설득력있는 답변을 찾지 못했습니다.

마침내 나는 this SO question을 보았고, 분명히 (적어도 개념적으로) 수용된 대답에서 무슨 일이 벌어지고 있는지 분명히 이해할 수있었습니다. 내 말에 동일한 프로그램을 복제하려고 할 때 그러나, 그것은 아래의 오류 던졌다 : 나는 위의 질문에뿐만 아니라 코멘트에 동일한을 게시 한

EncodeError: <AsyncResult: cf5875f1-7f72-449c-9808-07c9c9459737> is not JSON serializable

을, 문제는 매우 것 같다 나는 지금까지 내 의견에 어떤 견인을받지 못했습니다.

누군가 도와 드릴 수 있습니까?

+1

[아무도 내 질문에 대답하지 않았습니다.] (https://stackoverflow.com/help/no-one-answers)를보십시오. 다시 게시하는 것은 올바른 일이 아닙니다. – SiHa

답변

0

this SO answer의 대답이 실제로 내가 원하는 것을 달성하는 데 도움이되었습니다. (아마도 이것은 해킹 방법 이었지만 내 문제를 해결했습니다.) 대답은 그러나 같은 오류가 발생했습니다 : 나는 다음과 같이 해결할 수 있었다

EncodeError: <AsyncResult: cf5875f1-7f72-449c-9808-07c9c9459737> is not JSON serializable

사용 사례에 따라서

(나는 그 대답에 의견이 변화를 언급 한) 대답의 일부 :

tasks = [] 
for i in xrange(10): 
    tasks.append(power.delay(i, 2)) 

amass.delay([], tasks) 

amass.delay()의 두 번째 매개 변수로 우리는 작업 개체의 목록을 전달합니다. 방금 작업 ID 목록을 실제로 전달하도록 변경했습니다. 그래서 amass()는 이제 다음과 같습니다

tasks = [] 
for i in xrange(10): 
    x = power.delay(i, 2) 
    tasks.append(x.id) 

amass.delay([], tasks) 

및 아래에 표시하고 오류를 해결하고 난 달성하기 위해 노력했던 일을 한 것처럼 amass()의 각 변경했습니다.

@celery.task() 
def amass(results, tasks): 
    completed_tasks = [] 
    for task_id in tasks: 
     result = AsyncResult(task_id, app=celery) 
     if result.ready(): 
      completed_tasks.append(task_id) 
      #results.append(task.get()) did not need this so commented it out 

    # remove completed tasks 
    tasks = list(set(tasks) - set(completed_tasks)) 

    if len(tasks) > 0: 
     # resend the task to execute at least 1 second from now 
     amass.delay(results, tasks, countdown=1) 
    else: 
     # we done 
     print results 
0

경우에 당신은 이미 다른 후 하나를 실행해야하고 만 chords를 사용할 필요가 결과를 결합하려는 작업의 목록을 가지고있다.

다른

당신은 사람 (즉시) 셀러리에 작업을 계속 추가하는 경우 그리고 당신은 그들이 당신이의를 달성 할 수있는 동시성 = 1 일 명 근로자를 설정하여 다음, 하나씩 실행하려면 작업은 직렬로만 실행됩니다.

또한 병렬 실행 문제가 있었으므로 처음에는 동시성이 1 인 작업자를 실행하여 문제를 해결했지만 이후에는 대안을 얻기 위해 잠금 메커니즘을 사용했습니다.

관련 문제