엔티티를 업데이트하고 데이터 저장소에 저장 한 다음 요청을 처리하기 전에 (백그라운드 작업을 대기열에 넣고 일부 결과를 json-serialize하는 등) 몇 가지 추가 작업을 수행해야하는 요청 처리기가 있습니다. 엔티티가 저장되는 동안 추가 작업이 완료되도록이 코드를 병렬 처리하려고합니다.ndb가 put_async() 호출을 일괄 처리하지 못하게하고 RPC가 즉시 실행되게하는 방법?
class FooHandler(webapp2.RequestHandler):
@ndb.toplevel
def post(self):
foo = yield Foo.get_by_id_async(some_id)
# Do some work with foo
# Don't yield, as I want to perform the code that follows
# while foo is being saved to the datastore.
# I'm in a toplevel, so the handler will not exit as long as
# this async request is not finished.
foo.put_async()
taskqueue.add(...)
json_result = generate_result()
self.response.headers["Content-Type"] = "application/json; charset=UTF-8"
self.response.write(json_result)
그러나, Appstats는 datastore.Put
RPC는 taskqueue.Add
후, 순차적으로 수행되고 있음을 보여줍니다 :
약간은 주위 파고
여기 내 처리기 코드는 아래로 비등 무엇 ndb.context.py
은 put_async()
호출이 RPC가 즉시 발행되는 대신 AutoBatcher
에 추가되는 것을 보여줍니다.
따라서 toplevel
이 완료되면 비동기 호출이 완료 될 때까지 이 플러시되는 것으로 추정됩니다.
일괄 처리 puts는 특정 시나리오에서 실질적인 이점을 가지고 있음을 이해합니다. 그러나 제 경우에는 put RPC를 즉시 보내 줘서 엔티티가 저장되는 동안 다른 작업을 수행 할 수 있습니다.
내가 yield foo.put_async()
할 경우, 나는 Appstats에서 같은 폭포를 얻을 수 있지만, datastore.Put
에 가장 우선적으로 수행되고 : yield
내 핸들러가 기다릴 수로,
이 예상 될 수있다 나머지 코드를 실행하기 전에 put_async()
호출을 완료하십시오.
나는 마우스 오른쪽 foo.put_async()
후 ndb.get_context().flush()
에 대한 호출을 추가 시도하지만, datastore.Put
및 taskqueue.BulkAdd
전화는 여전히 Appstats에 따라 병렬로 만든되지 않습니다.
내 질문은 : put_async()
에 대한 호출을 자동 배터를 우회하여 RPC를 즉시 발급 할 수 있습니까?
foo = yield Foo.get_by_id_async(some_id)
future = foo.put_async()
future.done()
NDB 요청은 autobatcher에 넣어 얻을, 당신은 결과를 필요로 할 때 배치가 RPC로 전송됩니다 :
생산 중이거나 현지에 있습니까? – Lipis
제작 중입니다. –