2012-11-25 4 views
1

Google 애플리케이션 엔진에서 작업 대기열을 사용하는 데 문제가 있습니다. 이 사이트에서와 같은 일을 시도 : https://developers.google.com/appengine/docs/python/taskqueue/overview-pushGoogle 앱 엔진 작업 대기열

하지만 내 작업이 실행되지 않습니다처럼, 나는이 오류 얻을 것 같다

경고 2012년 11월 25일 15 : 29 : 21,258 taskqueue_stub.py를 : 1978] 작업 task1을 실행하지 못했습니다.

class CounterWorker(webapp.RequestHandler): 
    def init(self): # should run at most 1/s 
    def txn(): 
     logging.info("bla") 
    db.run_in_transaction(txn) 

난 그냥이 같은 작업을 추가 : 내가 정말 원하는 것은

taskqueue.add(url='/worker') 

은 그냥이 작업은 12.800 초

코드는 주로 이들의 제외하고는 동일에 다시 시도합니다 타임 아웃을하지 않는 코드 블록을 실행합니다. 그래서 나는 taskqueues를 사용할 수 있다고 읽었다. 그러나 나는 그것을 작동시키는 것처럼 보이지 않는다.

답변

4

"바닐라"작업을 실행하려면 지연된 기능을 살펴보십시오.

Background work with the deferred library

from google.appengine.ext import deferred 

    def do_something_expensive(a, b, c=None): 
     logging.info("Doing something expensive!") 
     # Do your work here 

    # Somewhere else 
    deferred.defer(do_something_expensive, "Hello, world!", 42, c=True) 

직접 기능을 전달할 수있는 당신은 URL/웹 애플리케이션 핸들러를 필요가 없습니다.

+0

Woops, 코멘트를 잘못 장소. 답변을 해결책으로 표시했습니다 :) 감사합니다. – WYS

+0

이제 PicklingError가 발생합니다. 을 피클 할 수 없습니다. 완료되면 MainHandler에서 함수를 호출 할 때 _sre.SRE_Pattern으로 찾을 수 없습니다. : – WYS

+0

나는 그 핸들러가 작업이 돌아올 때까지 오랫동안 사라 졌기 때문에 그렇게 생각할 것이다. 필요할 경우 영원히 실행할 수있는 핸들러 만 필요하다면 백엔드를 보았는가? https://developers.google.com/appengine/docs/python/backends/ –

5

기본적으로 작업 대기열은 URL에 매핑되는 처리기 (작업자/작업자, CounterWorker에 매핑되어야 함)에 POST 요청을 보냅니다. 따라서 CounterWorker 메서드에서 post 메서드를 정의해야합니다.

class CounterWorker(webapp.RequestHandler): 
    def post(self): 
    def txn(): 
     logging.info("bla") 
    db.run_in_transaction(txn) 

귀하의 의견은 작업이 1/s로 실행되어야한다고 제안합니다. 이것을 queue.yaml config file에서 정의 할 수 있습니다.

또한 taskqueues에는 10 분의 시간 제한이 있으므로 영원히 작동하지 않습니다. 이 문제를 해결하려면 체인을 연결하거나 deferred API을 사용하십시오. 장기 실행 프로세스의 경우 backends API이 더 적합 할 것입니다.

+0

답변을 주셔서 감사합니다. 그러나 다른 하나는 주 솔루션이었습니다. 나는 당신을 upvoted :) – WYS