2013-01-29 2 views
3

내 문제가 가장 릴리스 메모리에 asynchrones URL의 응답 AppEngine에의 요구를 가져 오는 방법입니다 메모리를 해제합니다. 다음은 기본적으로 파이썬에서 수행하는 작업입니다.모범 사례는

rpcs = [] 

for event in event_list: 
    url = 'http://someurl.com' 
    rpc = urlfetch.create_rpc() 
    rpc.callback = create_callback(rpc) 
    urlfetch.make_fetch_call(rpc, url) 
    rpcs.append(rpc) 

for rpc in rpcs: 
    rpc.wait() 

내 테스트 시나리오에서는 1500 요청에 해당합니다. 그러나 짧은 시간 내에 훨씬 더 많은 것을 처리 할 수있는 아키텍처가 필요합니다.

그런 다음 결과를 처리하기 위해 큐에 작업을 추가하는 콜백 함수,이 : 내가 너무 많은 동시 RPC 호출을 수행하는 것이,

def event_callback(rpc): 
    result = rpc.get_result() 
    data = json.loads(result.content) 
    taskqueue.add(queue_name='name', url='url', params={'data': data}) 

내 문제는, 나의 인스턴스 충돌의 메모리 :

del result 
del data 
:

은 이미 세 가지 시도 "975 개 요청을 처리 한 후 159.234 MB 소프트 개인 메모리 제한을 초과은 총" 5,

result = None 
data = None 

및 I 콜백 함수 후 수동 가비지 수집기 달렸다. 따라서 인스턴스 충돌 -

gc.collect() 

그러나 아무것도는 콜백 함수는 큐에 작업을 추가 한 후 바로 메모리를 해제하는 것. 그것을 할 다른 방법이 있습니까?

+0

동안하지 솔루션 등, 사용 가능한 메모리를 증가 인스턴스 클래스를 변경. –

+0

확인 그래 -하지만 아직 나에 대한 최종 해결책 : 작업에 –

답변

2

잘못된 접근 방법 :이 URL을 (넣기) 대기열에 넣고 원하는 값 (defaut : 5/초)으로 비율을 높이고 각 작업이 하나의 URL 불러 오기 (또는 그 그룹)를 처리하도록합니다. 안전 제한값은 3000 url-fetch-api-calls/minute (하나의 url-fetch는 하나 이상의 api-call을 사용할 수도 있음)에 유의하십시오.

+0

문제는 그 때문에 응답 할 때까지 대기 시간에 당신은 충분히 병렬 빠른 충분한 작업을 실행하는 경우를 많이해야합니다이며, 비용 효율성 측면에서 어떤 많은 시간을 요할 것입니다. 흠 - 어떻게 할당량이 나를 보여줄 때, 내가 46,342,179 통화를 할 수 있는지, 3000 url-fetch-api-calls/minute 제한이있을 수 있습니까? 1 분당 3000 회는 하루에 4,320,000 건을 의미합니다. –

+0

무료/유료 앱에 대한 제한 사항이 다릅니다. 이 앱은 무료 앱이었습니다. https://developers.google.com/appengine/docs/quotas를 참조하십시오. 1 개의 작업 (10, 100, ..)에 여러 개의 URL을 넣고 한 번에 처리 할 수 ​​있습니다. 또한 응용 프로그램에서 스레드를 사용하는 경우 한 인스턴스에서 한 번에 둘 이상의 태스크를 처리 할 수 ​​있습니다. 그 다음 메모리 한도에 도달하면, 그냥 내가 볼 –

+0

을 최근 요청 (들)을 중단 (이러한 일정을 변경, 그래서 아무 것도 손실되지 것)한다 - 덕분에 많이 :) 나는 그것을 시도 할 것이다! –

1

urlfetch에 대한 작업 대기열을 사용하여 팬 아웃하고 피하십시오 메모리를 소모하고, 명명 된 작업을 등록하고, event_list 커서를 다음 작업에 제공합니다. 모든 프로세스에 대해 새 작업을 등록하는 대신 이러한 시나리오에서 + 프로세스를 가져오고 싶을 수 있습니다. 특히 프로세스에 데이터 저장소 쓰기가 포함되어있는 경우에는 더욱 그렇습니다.

나는 이러한 비동기 솔루션은 더 우아하게 NDB를 찾을 수 있습니다.

체크 아웃 브렛 Slatkins는 scalable apps 아마도 pipelines 얘기.

+0

"명명 된 작업을 등록하고 다음 작업에 event_list 커서를 제공하십시오"라는 말을 정확히 이해하지 못합니다 - 명명 된 작업을 등록하는 방법을 알고 있지만 정확히 무엇을합니까? –

+0

방금 ​​파이프 라인 비디오를 보았습니다. 처음 15 분 안에 모든 것이 설명되었습니다. 고마워요! 그게 내 문제의 해결책이야! –

+0

비디오를 보지 않은 사람들을 위해, 명명 된 작업은 포크 폭탄을 피하기 위해 사용됩니다. 그렇지 않으면 작업이 새로운 작업을 등록 할 때 오류가 발생한 후 재실행 할 때 중복 작업을 등록 할 것입니다. – tesdal