2011-02-07 2 views
2

첫 번째 GAE 애플리케이션을 빌드하고 디버깅하려고하며 이미 기본 대기열에서 처리중인 작업을 처리하는 데 Stackoverflowers의 놀라운 지원을 활용했습니다. . 감사!Google App Engine의 채널 및 TaskQueues (클라이언트 디버깅)

그러나 대기열을 사용하여 백그라운드에서 '긴'작업을 수행하는 방법을 보여주고 싶습니다. 내 생각은 :

  1. 큰 파일을 처리하라는 요청을받습니다.
  2. 파일을 저장하고 작업을 대기열에 넣습니다.
  3. 응답을 반환하십시오.
  4. 파일을 백그라운드에서 처리합니다.
  5. 고객이 채널을 통해 작업이 완료되었음을 알립니다.

나는이 모든 것이 작동하지만 하나의 문제가 있습니다. 내 개발 서버에서 작업 대기열은 백그라운드에서 작업을 처리하지 않는 것 같습니다. 장기간 작업을 시뮬레이트하기 위해 방금 잠을 자 았습니다.

def post(self): 
    time.sleep(60) 
    #use a channel to let the client know we're done 

GAE 개발 서버는 단일 스레드 인 것처럼 보입니다. 항목이 대기열에서 처리 될 때까지는 전혀 응답하지 않습니다. 이 가정이 맞습니까? 어떤 아이디어?

감사 코드 exanples 추가

:

#code to enqueue task 
taskqueue.add(url='/processSubmission', params={'key': activity.key() }, transactional=False) 

#class that processes queued work 
class ProcessSubmission(webapp.RequestHandler): 
    def post (self): 
    time.sleep(60) 
    activity = db.get(db.Key(encoded=self.request.get('key'))) 
    activity.approved = True 
    activity.put() 
    channel.send_message(activity.userid, 'Wahoo! we are done') 
+0

코드의 관련 부분을 게시 할 수 있습니까? – systempuntoout

+0

완료 - 코드를 추가했습니다. 희망이 충분합니다. – ConfusedNoob

답변

2

예, 앱 엔진 dev_appserver는 단일 스레드이며, 한 번에 하나의 요청을 처리합니다. 그러나 사용자 대면 요청은 작업 대기열 요청 처리를 시작하기 전에 반환되어야합니다.

+0

저는 지금이 수많은 방법들을 테스트 해 보았습니다. 정말로 그렇지 않습니다. 대기중인 항목을 완료하기 전에 반환되는지 확신합니까? 만약 당신이 맞다면, 채널이있는 샘플이 작동해야합니다. (더 간단한 설정을 시도했습니다.) – ConfusedNoob

+1

@ConfusedNoob 예 - 작업은 사용자 요청에 비동기 적으로 실행됩니다. dev_appserver의 Channel API는 폴링을 사용하지만 태스크가 실행을 완료 할 때까지 폴링 요청이 진행되지 않는다는 것을주의하십시오. 이는 관찰중인 원인 일 수 있습니다. –

+0

그러면 전체 시나리오가 제대로 작동하지 않는 이유를 설명 할 수 있습니다.하지만 응답 시간이 60 초를 초과하는 이유는 설명하지 않습니다. – ConfusedNoob