2011-02-01 5 views
3

신호 모듈은 Google App Engine의 python 버전에서 지원되지 않으므로 메소드를 호출하고 메소드가 2 초 이내에 반환되지 않으면 예외를 throw/catch하는 가장 간단한 방법은 무엇입니까?Google App Engine의 Python 버전에서 특정 메소드의 허용 된 실행 시간을 어떻게 제한 할 수 있습니까?

+0

지원되지 않는 문서는 어디에서도 볼 수 없습니다. 아무 것도 찾지 못 했습니까? 아니면 그냥 사용하려고 시도하고 가져올 때 빈 모듈을 가져옵니다. –

답변

4

이 같은 데이터 저장소와 같은 RPC 호출에 대해 얘기하는 경우에는 기한 (create_rpc 참조)과 함께 RPC를 만들 수 있습니다, 데이터 저장소 기능 (db.get, db.put 등), 다음 캐치로 RPC를 전달 DeadlineExceededErrors.

# Set a five-second timeout 
rpc = db.create_rpc(deadline=5) 

# A query: 
query = YourModel.all().fetch(100, rpc=rpc) 

URLFetchfetch 기능은 데드 파라미터 걸린다.

코드를 직접 구현하려면 time 모듈을 참조하십시오.

+0

감사. RPC 시간 초과 기능은 많은 경우에 유용하지만, 호출 할 메소드가 쿼리 또는 데이터 저장소 기능을 완료하기 위해 대기하지 않을 경우 어떻게 타임 아웃 예외를 발생시킬 수 있습니까? 인위적인 예제로서, 내가 호출하는 메서드가 무한 루프에 걸린다고 가정 해 봅시다. – Chris

+0

@Chris, 당신은 '시작 시간'을 저장하고 현재 시간과 비교함으로써 기본적인 점검을하기 위해 시간 모듈을 사용할 수 있습니다. 일단 한계를 넘으면 루프에서 빠져 나오거나 함수에서 돌아온다. –

+0

다시 한번 감사드립니다. 다른 URL을 가져 오는 것이 실용적인 접근 방법이라고 생각합니다. 가져온 URL에서 메소드를 실행할 수 있으며 페칭을 수행하는 메소드에서 URLFetch 최종 기한을 사용할 수 있습니다. – Chris

0

루프에서 루프가 시작된 시간을 저장하고 각 반복에서 얼마나 오래되었는지 확인할 수 있습니다.

이 아니고 회 돌이가이 아닌 경우 다소 번거 롭습니다. 몇 줄의 코드마다 시간 확인 비트를 추가 할 수 있습니다. 이것은 물론 추악한 코드를 만들지 만 백그라운드에서 타이머를 실행하고 실행중인 코드를 인터럽트 할 수있는 스레드를 생성 할 수있는 능력이 없으면 주변 코드가별로 없습니다.

관련 문제