2014-05-22 2 views
0

이 질문에 실제로 질문이 있으면 죄송합니다. 나는 꽤 많이 둘러 보았고 여기저기서 정보를 발견했지만 완전히 도움이되는 것은 아무것도 없었다.GAE에서 파이썬으로 지연된 작업을위한 작업 대기열

파이썬 코드로 처리되는 파일을 업로드 할 수있는 파이썬의 Google App 엔진에 응용 프로그램을 구축하고 처리 된 파일을 전자 메일로 사용자에게 다시 보냅니다. .

처음에는 지연된 작업을 사용하여 효과적이었습니다. 시간이 지남에 따라 프로세싱이 DeadlineExceededError에 도달하기 전에 10 분 이상 걸릴 수 있으므로 더 영리해야합니다.

그래서 작업 대기열을 조사하고 파일을 청크로 처리하는 대기열을 만들고 싶었고 마지막에 모든 것을 함께 모으기 시작했습니다. 이 같은 단일 지연된 작업의 모양을 만들기위한

내 현재 코드 :

_=deferred.defer(transform_function,filename,from,to,email) 

그래서 transform_function 코드에서,에 이메일, 파일 이름의 값을 가져오고 처리를 할 떠난다있다.

다른 사람이 차례로 작동하는 선형 작업 체인으로 전환하는 방법을 알려주십시오. 내가 생각할 수있는 Google 애플리케이션 엔진의 모든 문서를 읽었지만 실제 코드 조각에 관해서는 불행히도 충분히 자세히 작성되지 않았습니다.

내가 좋아하는 것들에 대한 참조를 참조하십시오

taskqueue.add(url='/worker', params={'key': key}) 

을하지만 난 내 작업에 대한 URL이 아니라 다른 곳에서 구현 된 transform_function()를 가지고 있지 않기 때문에, 나는 이것이 나에게 어떻게 적용되는지 볼 수 없습니다 ...

많은 감사!

답변

0

각 단계가 끝나면 작업을 실행하기 위해 deferred를 계속 호출 할 수 있습니다. 다른 대기열에서는 일정 및 요금을 제어 할 수 있지만 동일하게 작동합니다.

작업의 경과 시간을 추적하고 처리 창의 끝 부분에 도달하면 코드가 수행중인 작업을 중단하고 체인의 다음 작업을 연기하거나 계속 중단 된 부분에서 작업을 계속합니다. 그것의 별개의 설정 단계 또는 계속 작업 덩어리 인 경우. 이것은 작업이 60 초 동안 만 실행될 수있을 때 모두 다시 기록되었습니다.

그러나 문제는 (정상적인 작업 대기열인지 지연되는지는 중요하지 않음) 각 단계가 어떤 이유로 실패 할 수 있고 다시 실행되어 각 단계가 멱등수가되어야한다는 것입니다.

긴 실행 체인 작업의 경우 데이터 저장소에 작업의 설명이 들어있는 엔티티를 구성하고 작업의 처리 상태를 추적 한 다음 완료 될 때까지 동일한 작업을 다시 실행합니다. 완료되면 작업이 완료된 것으로 표시됩니다.

+0

감사합니다. 개념적으로 나는 당신이 의미하는 바를 이해하는 데 아무런 문제가 없습니다. 실제로 문제가된다는 것을 실천하고 있습니다. 나는 두려워합니다. 이미 지연된 작업 내에서 지연된 작업에 대한 다른 호출을하면 첫 번째 작업은 여전히 ​​결국 deadlineExceededError를 던지지 않을까요? 또는 return 문을 사용하여 실행중인 첫 번째 작업을 "중지"시키는 방법은 무엇입니까? – user3664865

+1

이해가 잘못되었습니다. 가장 마지막으로하는 일은 deferred를 호출하여 새로운 작업을 수행하는 것입니다. 그런 다음 상태 200을 반환하고 실행중인 작업이 완료되었는지 확인하십시오. –

0

10 분의 시간 초과를 피하려면 "_target"매개 변수를 사용하여 백엔드 또는 B 유형 모듈 에 요청을 보낼 수 있습니다.

동의어, 청크를 순차적으로 처리해야하는 이유는 무엇입니까? 모든 청크가 완료되면 알림이 필요합니다 (따라서 "끝까지 모두 정리"할 수 있음). 여러 가지 방법으로 구현할 수 있습니다 (예 :청크에 대한 각각의 지연된 작업은 청크의 수로 초기화 된 공유 데이터 스토어 카운터 [동일한 트랜잭션에서 모두 읽기 상태, 감소 및 업데이트]를 줄일 수 있습니다. 데이터 저장소 업데이트가 성공적이었고 카운터가 0에 도달하면 모든 조각을 함께 결합하여 진행할 수 있습니다. 제안 된 워크 플로를 단순화하는 지연을 사용하는 대신 파이프 라인 (https://code.google.com/p/appengine-pipeline/wiki/GettingStarted)을 사용할 수 있습니다.