Processos de Integração “Async/Await” com o Magic xpi

Veja nesta publicação como implementar o padrão de design compatível com async/await, com a plataforma Magic xpi.

A ideia do async/await pode ser bem compreendida através de várias publicações técnicas sobre o tema, disponíveis na internet.

Mas para resumir o conceito antes de prosseguir, vamos imaginar o seguinte algoritmo:

Uma sequência lógica de ‘n‘ tarefas a executar, umas mais demoradas que outras (como de costume).

A tarefa #2 é a mais demorada de todas para completar e retornar seu valor. E este valor é necessário para executar a tarefa #6.

Mas não é necessário, por exemplo, para executar as tarefas #3, #4 e #5.

De fato (segundo a lógica do processo de negócio proposta nesta questão), foi definido que a tarefa #4 precisa do resultado da tarefa #3, a tarefa #5 precisa do resultado da tarefa #4, mas somente a tarefa #6 (como dito) precisa do resultado da tarefa #2 para completar sua missão.

Assim, entendemos que a tarefa #5 precisa executar “depois” da #4, a tarefa #4depois” da #3 e a tarefa #6depois” de todas elas (#2, #3, #4 e #5).

Essa sequência de ações é facilmente definida no Magic xpi desta forma:

 

Um sequência linear de ações na ordem necessária, que produz este resultado quando executado (atente para os tempos de cada ação):

 

Mas daí, surge a questão: porque esperar a conclusão (mais demorada) da tarefa #2, antes de executar as tarefas #3 , #4 e #5, se o seu resultado só é relevante para a tarefa #6?

É aí que entra o async/await.

A tarefa #2 pode ser executada em paralelo (async) e a tarefa #6 pode requisitar o seu valor/resultado (await) apenas no momento de sua própria execução, quando de fato ele será necessário.

Neste padrão de design, o await garante que o valor requisitado da tarefa async estará disponível quando necessário.

Se ele já estiver disponível no momento da solicitação, o valor é imediatamente coletado e utilizado.

Se ainda não estiver, o awaitaguarda” a tarefa async finalizar antes de prosseguir.

*Nota: esse padrão envolve também o conceito de promise, ou seja: seu valor estará lá quando você precisar dele.

 

E esta ideia (conceito) pode também ser implementada nos fluxos de integração do Magic xpi através dos componentes Post Event e Wait for Event.

Veja a mesma sequência de tarefas (algoritmo) anterior, agora refatorada como async/await:

 

A tarefa #2, mais demorada, foi iniciada em paralelo (outra thread) assim que possível, enquanto as demais tarefas (#3 até #6) seguiram sua execução (thread atual).

A tarefa #2avisa” quando finalizou através do Post Event.

Já na outra thread que seguiu em paralelo, a tarefa #6 (que depende do valor resultante da tarefa #2) não inicia antes de “ser avisada” que ela (tarefa #2) já finalizou.

Esta verificação (e possível espera) é feita pelo Wait for Event.

 

Observe agora, a diferença de tempos no resultado desta execução:

 

Embora o tempo individual de cada tarefa não tenha sido alterado, o tempo final (do todo) foi menor, por conta da otimização do que podia ser feito em paralelo (async).

Mas sem prejudicar a dependência que uma tarefa tinha em relação a uma outra (await).

 

Intercâmbio de dados entre diferentes threads (contextos)

 

A ideia do await tem fundamento no princípio que ele “precisa” do resultado da execução paralelo (async), antes de continuar. Por isso ele precisa “esperar” caso o valor ainda não exista quando foi solicitado.

O Wait for Event garante a “espera” da conclusão desta tarefa async. Mas e o resultado (valores calculados) dela?

No Magic xpi, esta troca de valores entre os contextos (threads) pode, por exemplo, ser realizada através de um ODS Global.

A tarefa #2 (async) pode guardar seu resultado em uma tag (chave) de ODS Global, de forma que a tarefa #6, conhecendo previamente o nome desta tag, tenha acesso a ela com a função ODSGet() (por exemplo).

Então, a tarefa #2 (async) deve guardar seu resultado “antes” do Post Event, e a tarefa #6 (await) deve recolher este resultado “após” o Wait for Event.

Numa construção semelhante a esta:

 

Fique ligado aqui no Blog, para mais publicações sobre o Magic xpi.

Manoel Frederico Silva – Gerente de Tecnologia e Evangelista MAGIC – Magic Brasil
Manoel Frederico Silva – Evangelista MAGIC – Magic Brasil

 

Para receber os artigos do Blog Magic Brasil em primeira mão no seu email, registre-se aqui

 

Deixe um comentário

O seu endereço de e-mail não será publicado.