google.appengine.ext.ndb.tasklets 모듈

요약

tasklet 데코레이터입니다.

tasklet은 스레드 없이 동시 실행 함수를 작성하는 방법입니다. tasklet은 이벤트 루프에 의해 실행되며 I/O 또는 기타 작업에 yield 문을 사용하여 자신이 차단되는 것을 정지할 수 있습니다. 차단 작업의 개념은 Future 클래스로 추상화되지만 tasklet은 RPC가 완료될 때까지 기다리기 위해 RPC를 산출할 수도 있습니다.

@tasklet 데코레이터는 생성되었을 때 이벤트 루프로 생성기가 실행되는 동안 Future가 반환되도록 생성기 함수를 래핑합니다. tasklet 내에서 Future의 모든 산출이 기다렸다가 Future 결과를 반환합니다. 예를 들면 다음과 같습니다.

@tasklet
def foo():
  a = yield <some Future>
  b = yield <another Future>
  raise Return(a + b)

def main():
  f = foo()
  x = f.get_result()
  print x

get_result()를 사용하여 Future 결과를 사용할 수 있을 때까지는 차단이 다소 비효율적입니다(광범위하게는 아니지만 대기 시간이 많지 않음). 대부분의 경우 이러한 코드는 대신 tasklet으로 재작성되어야 합니다.

@tasklet
def main_tasklet():
  f = foo()
  x = yield f
  print x

tasklet을 호출하면 이벤트 루프를 사용하여 자동으로 예약됩니다.

def main():
  f = main_tasklet()
  eventloop.run()  # Run until no tasklets left to do
  f.done()  # Returns True

특수 기능으로서, 래핑된 함수가 생성기 함수가 아니면 Future를 통해 반환 값이 반환됩니다. 이렇게 하면 다음 두 가지가 동일하게 됩니다.

@tasklet
def foo():
  return 42

@tasklet
def foo():
  if False: yield  # The presence of 'yield' makes foo a generator
  raise Return(42)  # Or, after PEP 380, return 42

이 기능(Monocle에서 영감을 받은)은 tasklet이 필요하지만 일시중지가 필요하지 않은 인터페이스를 구현하는 경우에 효과적입니다. tasklet을 생성기로 만들기 위해 더미 산출을 삽입할 필요가 없습니다.

목차

google.appengine.ext.ndb.tasklets.Return

StopIteration의 별칭

google.appengine.ext.ndb.tasklets.tasklet(func)소스
google.appengine.ext.ndb.tasklets.synctasklet(func)소스

호출 시 함수를 tasklet으로 실행하는 데코레이터입니다.

이를 사용하여 일부 웹 애플리케이션 프레임워크(예: Django 보기 함수 또는 webapp.RequestHandler.get 메서드)에서 호출할 요청 핸들러 함수를 래핑합니다.

google.appengine.ext.ndb.tasklets.toplevel(func)소스

새 기본 컨텍스트를 설정하는 동기화 tasklet입니다.

webapp.RequestHandler.get() 또는 Django 뷰 함수와 같이 최상위 뷰 함수에 사용합니다.

google.appengine.ext.ndb.tasklets.sleep(dt)소스

일정 시간 동안 대기하는 공개 함수입니다.

예시

yield tasklets.sleep(0.5) # Sleep for half a sec.

google.appengine.ext.ndb.tasklets.add_flow_exception(exc)소스

로깅하지 않아야 하는 예외를 추가합니다.

인수는 예외의 서브클래스여야 합니다.

google.appengine.ext.ndb.tasklets.get_return_value(err)소스
google.appengine.ext.ndb.tasklets.get_context()소스
google.appengine.ext.ndb.tasklets.set_context(new_context)소스
google.appengine.ext.ndb.tasklets.make_default_context()소스
google.appengine.ext.ndb.tasklets.make_context(*args, **kwds)소스
google.appengine.ext.ndb.tasklets.Future(info=None) 클래스소스

기본: 객체

Future에 콜백이 0개 이상 있습니다.

결과가 준비되면 콜백이 호출됩니다.

참고: 이는 어느 정도 영감을 얻었지만 PEP 3148에서 정의한 Future 인터페이스를 준수하지 않습니다. 또한 App Engine 관련 UserRPC 및 MultiRpc 클래스에서 영향을 받아 호환성을 유지하려고 시도합니다.

FINISHING = 2
IDLE = 0
RUNNING = 1
add_callback(callback, *args, **kwds)소스
add_immediate_callback(callback, *args, **kwds)소스
check_success()소스
done()소스
dump()소스
dump_stack()소스
get_exception()소스
get_result()소스
get_traceback()소스
set_exception(exc, tb=None)소스
set_result(result)소스
state
wait()소스
classmethod wait_all(futures)소스
classmethod wait_any(futures)소스
google.appengine.ext.ndb.tasklets.MultiFuture(info=None) 클래스소스

기본: google.appengine.ext.ndb.tasklets.Future

다른 여러 Future에 종속되는 Future입니다.

내부적으로 ‘v1, v2, … = yield f1, f2, …’에서 사용됩니다. 해당 사용 사례에서는 시맨틱스(예: 오류 처리)가 제한됩니다.

호출자 POV의 프로토콜은 다음과 같습니다.

mf = MultiFuture()
mf.add_dependent(<some other Future>)  -OR- mf.putq(<some value>)
mf.add_dependent(<some other Future>)  -OR- mf.putq(<some value>)
  .
  . (More mf.add_dependent() and/or mf.putq() calls)
  .
mf.complete()  # No more dependents will be added.
  .
  . (Time passes)
  .
results = mf.get_result()

이제 모든 종속 Future가 추가된 순서대로 나열된 목록이 결과로 반환됩니다.

동일한 종속 항목을 여러 번 추가해도 됩니다.

언제든지 콜백을 추가할 수 있습니다.

종속 Future POV에서는 수행할 작업이 없습니다. 콜백이 각 종속 Future에 자동으로 추가되어 MultiFuture에 완료를 알립니다.

오류 처리: 종속 Future에 오류가 발생하면 mf로 전파됩니다. 초기 오류를 강제 적용하려면 mf.complete() 대신 mf.set_exception()를 호출하면 됩니다. 이후에는 mf.add_dependent() 또는 mf.putq()를 더 이상 호출할 수 없습니다.

add_dependent(fut)소스
complete()소스
putq(value)소스
set_exception(exc, tb=None)소스
google.appengine.ext.ndb.tasklets.QueueFuture(info=None) 클래스소스

기본: google.appengine.ext.ndb.tasklets.Future

MultiFuture와 동일한 프로토콜을 따르는 큐입니다.

하지만 결과를 목록으로 반환하는 대신 한 번에 하나씩 getq()를 사용해서 준비되는 대로 즉시 결과를 검색할 수 있게 해줍니다. Future 자체는 검색되었는지 여부에 관계없이 마지막 결과가 준비되었을 때 None 결과로 완료됩니다.

getq() 메서드는 다음 결과가 준비될 때까지 차단되는 Future를 반환하고, 그런 후 해당 결과를 반환합니다. 각 getq() 호출은 하나의 고유한 결과를 검색합니다. 마지막 결과가 이미 반환된 다음 추가 getq() 호출은 EOFError를 해당 Future의 예외로 반환합니다. (즉, q.getq()가 언제나처럼 Future를 반환하지만 Future를 생성하면 EOFError가 발생합니다.)

참고: 또한 .putq(value)를 통해 값을 직접 푸시할 수도 있습니다. 하지만 흐름 제어는 없습니다. 생산자가 소비자보다 빠르면 큐가 바인딩되지 않은 상태로 증가합니다.

add_dependent(fut)소스
complete()소스
getq()소스
putq(value)소스
set_exception(exc, tb=None)소스
google.appengine.ext.ndb.tasklets.SerialQueueFuture(info=None) 클래스소스

기본: google.appengine.ext.ndb.tasklets.Future

QueueFuture와 비슷하지만 삽입 순서를 유지합니다.

이 클래스는 쿼리 작업에 사용됩니다.

불변:

  • _queue 및 _waiting 중 하나 이상이 비어 있습니다.

  • _waiting의 Future가 항상 대기 중입니다.

(_queue의 Future가 대기 중이거나 완료될 수 있습니다.)

아래 설명에서 add_dependencies()는 putq()와 같은 방식으로 처리됩니다.

putq()가 getq() 앞에 있으면 상황이 다음과 같습니다.

putq() v

_queue: [f1, f2, …]; _waiting: [] ^ getq()

여기에서 putq()는 Future를 _queue 오른쪽에 추가하고 getq()는 왼쪽에서 삭제합니다.

getq()가 putq() 앞에 있으면 다음과 같습니다.

putq() v

_queue: []; _waiting: [f1, f2, …]

^ getq()

여기에서 putq()는 _waiting 왼쪽에서 Future를 삭제하고 getq()는 오른쪽에 추가합니다.

둘 다 비어 있으면 putq()가 _queue 오른쪽에 Future를 추가하고 getq()는 _waiting 오른쪽에 추가합니다.

_full 플래그는 더 이상 putq()를 호출하지 않는다는 것을 의미합니다. complete() 또는 set_exception()을 호출하여 설정됩니다.

complete()를 호출하면 더 이상 putq() 호출이 수행되지 않습니다. getq()가 뒤에 있으면 이후 getq() 호출로 _queue가 빌 때까지 _queue를 소진하고, 이후 EOFError를 전달하는 Future를 반환합니다(getq() 자체는 EOFError를 일으키지 않음). complete()가 호출될 때 getq()가 앞에 있으면 _waiting의 Future에 모두 EOFError 예외가 전달됩니다(따라서 _waiting이 소진됨).

complete() 대신 set_exception()이 호출되면 EOFError 대신 설정된 예외 및 역추적이 사용됩니다.

add_dependent(fut)소스
complete()소스
getq()소스
putq(value)소스
set_exception(exc, tb=None)소스
google.appengine.ext.ndb.tasklets.ReducingFuture(reducer, info=None, batch_size=20) 클래스소스

기본: google.appengine.ext.ndb.tasklets.Future

MultiFuture와 동일한 프로토콜을 따르는 큐입니다.

그러나 종속 Future의 결과 목록이 되는 대신 '감소기' tasklet을 호출하여 결과가 계산됩니다. 감소기 tasklet은 값 목록을 사용하여 단일 값을 반환합니다. 값 하위 목록에서 여러 번 호출될 수 있고 sum()과 같이 작동합니다.

참고: 감소기 입력 값은 큐에 추가된 순서와 비교하여 재정렬될 수 있습니다.

add_dependent(fut)소스
complete()소스
putq(value)소스
set_exception(exc, tb=None)소스