2012-11-02 2 views
1

이것은 아마도 기본적인 질문이지만 대답을 찾을 수 없었습니다.장기 실행 프로세스 중에 메시지를 보내고 요청에 응답하도록 Python 태스크 대기열 및 채널 API를 얻으려면 어떻게해야합니까?

몇 분마다 데이터를 생성하여 클라이언트가 준비되는대로 즉시 받게하려는 프로세스가 있습니다. 현재 작업 대기열에서 장기 실행 프로세스가 있으며 for 루프 내에서 다른 작업 대기열에 채널 메시지를 추가합니다. 클라이언트는 성공적으로 채널 메시지를 수신하고 get 요청을 사용하여 데이터를 다운로드합니다. 그러나 메시지가 태스크 큐에 추가 될 때가 아니라 장기 실행 프로세스가 완료된 후 (약 10 분 후) 태스크 큐에서 메시지가 송신됩니다.
작업 대기열에있는 메시지를 즉시 보내도록하려면 어떻게해야합니까? for 루프를 몇 가지 작업으로 분리해야합니까? for 루프는 데이터 저장소에 게시 한 다음 작업에서 데이터를 반환하는 더 쉬운 방법이없는 한 다음 반복 (이상적인 솔루션처럼 보일 수 없음)을 검색해야하는 다수의 사전을 만듭니다.

작업 대기열에 메시지를 추가하지 않고 for 루프에서 메시지를 직접 보내지 않으면 서버가 클라이언트의 데이터 수신 요청에 응답하지 않는 것 같습니다 (for의 긴 루프 ?

from google.appengine.ext import db 
from google.appengine.api import channel 
from google.appengine.api import taskqueue 
from google.appengine.api import rdbms 

class MainPage(webapp2.RequestHandler): 
def get(self): 
## This opens the GWT app  

class Service_handler(webapp2.RequestHandler): 
def get(self, parameters): 
## This is called by the GWT app and generates the data to be 
## sent to the client. 
    #This adds the long-process to a task queue 
    taskqueue.Task(url='/longprocess/', params = {'json_request': json_request}).add(queue_name='longprocess-queue') 

class longprocess_handler(webapp2.RequestHandler): 
def post(self): 
    #This has a for loop that recursively uses data in dictionaries to 
    #produce kml files every few minutes 
    for j in range(0, Time): 
     # Process data 
     # Send message to client using a task queue to send the message. 
     taskqueue.Task(url='/send/', params).add(queue_name=send_queue_name) 

class send_handler(webapp2.RequestHandler): 
def post(self): 
    # This sends the message to the client 
    # This is currently not happening until the long-process finishes, 
    # but I would like it to occur immediately. 


class kml_handler(webapp2.RequestHandler): 
def get(self, client_id): 
## When the client receives the message, it picks up the data here. 

app = webapp2.WSGIApplication([ 
         webapp2.Route(r'/', handler=MainPage), 
         webapp2.Route(r'/Service/', handler=Service_handler), 
         webapp2.Route(r'/_ah/channel/<connected>/', handler = connection_handler), 
         webapp2.Route(r'/longprocess/', handler = longprocess_handler), 
         webapp2.Route(r'/kml/<client_id>', handler = kml_handler), 
         webapp2.Route(r'/send/', handler = send_handler) 
         ], 
         debug=True) 

내가 보내는 작업으로 긴 과정을 중단하고 데이터 저장소에서 결과를 검색해야합니까 : 응답을 차단 -running 과정) 여기

내 서버 코드의 단순화 된 버전입니다 send_handler를 즉시 실행 시키거나 뭔가 빠졌는가? 감사합니다.

+1

SDK에서 이러한 동작이 발생하거나 App Engine 자체에 배포 되었습니까? SDK는 한 번에 한 가지만 처리하며 채널 API의 동작은 다릅니다. – Greg

+0

App Engine SDK의 개발 모드에서 이러한 현상이 발생합니다. 따라서 프로덕션 모드에서 이러한 작업 대기열이 동시에 작동 할 수도 있습니다. – dave

답변

2

App Engine 개발 서버는 한 번에 하나의 요청 만 처리합니다. 생산 과정에서 이러한 일이 동시에 발생합니다. 프로덕션에서 시험해보고 예상대로 동작하는지 확인하십시오.

프로덕션 환경에서 채널 메시지를 보내려는 별도의 작업을 사용하지 않아도됩니다. 단지 주 작업에서 바로 전송해야합니다.

+0

감사합니다. 나는 이것을 생산 모드로 시도 할 것이다. – dave