Módulo google.appengine.ext.ndb.tasklets

Resumo

Um decorador tasklet.

Tasklets são uma maneira de escrever funções em execução simultânea sem threads. Os tasklets são executados por um loop de eventos e podem suspender o bloqueio para E/S ou alguma outra operação usando uma instrução yield. A noção de uma operação de bloqueio é abstraída na classe Future, mas um tasklet também pode produzir uma RPC para aguardar a conclusão da RPC.

O decorador @tasklet encapsula a função de gerador. Dessa maneira, quando chamado, um Future é retornado enquanto o gerador é executado pelo loop de eventos. Dentro do tasklet, qualquer rendimento de um Future aguarda e retorna o resultado de Future. Por exemplo:

@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

Bloquear até que o resultado de Future estar disponível usando get_result() é parcialmente ineficiente (mas não de maneira vasta, sem aguardar ocupado). Na maioria dos casos, esse código precisa ser reescrito como um tasklet:

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

Chamar um tasklet automaticamente o programa com o loop de eventos:

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

Como um recurso especial, se a função encapsulada não for uma função de gerador, o valor de retorno dela será retornado por meio de Future. Isso torna estes dois equivalentes:

@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

Esse recurso (inspirado por Monocle) é prático quando você está implementando uma interface que espera tasklets, mas não precisa suspender. Não é necessário inserir um rendimento fictício para transformar o tasklet em um gerador.

Índice

google.appengine.ext.ndb.tasklets.Return

alias de StopIteration

google.appengine.ext.ndb.tasklets.tasklet(func)source
google.appengine.ext.ndb.tasklets.synctasklet(func)source

Decorador para executar uma função como um tasklet quando chamado.

Use-o para encapsular uma função de gerenciador de solicitações que será chamada por alguma biblioteca de aplicativos da Web (por exemplo, uma função de visualização do Django ou um método webapp.RequestHandler.get).

google.appengine.ext.ndb.tasklets.toplevel(func)source

Um tasklet de sincronização que define um novo contexto padrão.

Use-o em funções de visualização de nível superior, como webapp.RequestHandler.get(), ou funções de visualização do Django.

google.appengine.ext.ndb.tasklets.sleep(dt)source

Função pública para suspensão temporária.

Exemplo

yield tasklets.sleep(0.5) # Suspensão por meio segundo.

google.appengine.ext.ndb.tasklets.add_flow_exception(exc)source

Adicione uma exceção que não precisa ser registrada.

O argumento precisa ser uma subclasse de Exception.

google.appengine.ext.ndb.tasklets.get_return_value(err)source
google.appengine.ext.ndb.tasklets.get_context()source
google.appengine.ext.ndb.tasklets.set_context(new_context)source
google.appengine.ext.ndb.tasklets.make_default_context()source
google.appengine.ext.ndb.tasklets.make_context(*args, **kwds)source
class google.appengine.ext.ndb.tasklets.Future(info=None)source

Bases: object

Um Future tem zero ou mais retornos de chamada.

Os retornos de chamada serão chamados quando o resultado estiver pronto.

OBSERVAÇÃO: isso é parcialmente inspirado em, mas não em conformidade com a interface Future definida por PEP 3148. Isso também é inspirado em (e tenta ser parcialmente compatível com) classes UserRPC e MultiRpc específicas do App Engine.

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

Bases: google.appengine.ext.ndb.tasklets.Future

Um Future que depende de vários outros.

Ele é usado internamente por "v1, v2, … = yield f1, f2, …". A semântica (por exemplo, processamento de erros) é restrita por esse caso de uso.

O protocolo do POV do autor da chamada é:

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()

Agora, o resultado é uma lista de resultados de todos os Futures dependentes na ordem em que foram adicionados.

É válido adicionar os mesmos dependentes várias vezes.

Os retornos de chamada podem ser adicionados a qualquer momento.

Em relação a um POV Future dependente, não há nada a ser feito: um retorno de chamada é automaticamente adicionado a cada Future dependente, que sinalizará a conclusão dele para o MultiFuture.

Processamento de erros: se algum Future dependente gerar um erro, este será propagado para mf. Para forçar um erro inicial, você pode chamar mf.set_exception(), em vez de mf.complete(). Depois disso, você não poderá mais chamar mf.add_dependent() ou mf.putq().

add_dependent(fut)source
complete()source
putq(value)source
set_exception(exc, tb=None)source
class google.appengine.ext.ndb.tasklets.QueueFuture(info=None)source

Bases: google.appengine.ext.ndb.tasklets.Future

Um Queue que segue o mesmo protocolo de MultiFuture.

Porém, em vez de retornar resultados como uma lista, ele permitirá recuperar resultados assim que eles estiverem prontos, individualmente, usando-se getq(). O próprio Future termina com um resultado None quando o último resultado está pronto (independentemente de ter sido recuperado ou não).

O método getq() retorna um Future que será bloqueado até o próximo resultado estar pronto e retornará esse resultado. Cada chamada getq() recupera um único resultado. As chamadas getq() extras depois do último resultado já ter sido retornado retornarão EOFError como a exceção de Future delas. Ou seja, q.getq() retorna um Future como sempre, mas produzir esse Future gera EOFError.

OBSERVAÇÃO: os valores também podem ser enviados diretamente por .putq(value). No entanto, não há controle de fluxo. Se o produtor for mais rápido do que o consumidor, a fila aumentará desordenadamente.

add_dependent(fut)source
complete()source
getq()source
putq(value)source
set_exception(exc, tb=None)source
class google.appengine.ext.ndb.tasklets.SerialQueueFuture(info=None)source

Bases: google.appengine.ext.ndb.tasklets.Future

Igual a QueueFuture, mas mantém a ordem de inserção.

Essa classe é usada por operações Query.

Invariantes:

  • Pelo menos um de _queue e _waiting está vazio.

  • Os Futures em _waiting estão sempre pendentes.

Os Futures em _queue podem estar pendentes ou concluídos.

Na discussão abaixo, add_dependent() é tratado da mesma maneira que putq().

Se putq() estiver à frente de getq(), a situação será esta:

putq() v

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

Aqui, putq() acrescenta um Future à direita de _queue, e getq() remove um da esquerda.

Se getq() estiver à frente de putq(), será assim:

putq() v

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

^ getq()

Aqui, putq() remove um Future à esquerda de _waiting, e getq() acrescenta um à direita.

Quando ambos estão vazios, putq() acrescenta um Future à direita de _queue, e getq() acrescenta um à direita de _waiting.

A sinalização _full significa que não serão feitas mais chamadas para putq(). Ela é definida chamando-se complete() ou set_exception().

Chamar complete() sinaliza que mais nenhuma outra chamada putq() será feita. Se getq() estiver atrás, as chamadas getq() subsequentes vão consumir _queue até que ele esteja vazio e, depois disso, retornarão um Future que passa EOFError (getq() propriamente dito jamais gera EOFError). Se getq() estiver à frente quando complete() for chamado, os Futures em _waiting terão todos passado uma exceção EOFError (o que acaba consumindo _waiting).

Se, em vez de complete(), set_exception() for chamado, a exceção e o traceback definidos serão usados, em vez de EOFError.

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

Bases: google.appengine.ext.ndb.tasklets.Future

Um Queue que segue o mesmo protocolo de MultiFuture.

No entanto, o resultado, em vez de ser uma lista de resultados de Futures dependentes, é calculado computado chamando-se um tasklet "redutor". O tasklet redutor utiliza uma lista de valores e retorna um único valor. Ele pode ser chamado várias vezes em sub-listas de valores e precisa se comportar como, por exemplo, sum().

OBSERVAÇÃO: os valores de entrada do redutor podem ser reordenados em comparação com a ordem na qual foram adicionados à fila.

add_dependent(fut)source
complete()source
putq(value)source
set_exception(exc, tb=None)source
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente padrão do App Engine para Python 2