Comportamento OneShot no SPADE
O comportamento do tipo oneshot é um comportamento que realiza o processamento uma vez apenas e termina o comportamento.
O código a seguir ilustra 3 comportamentos, sendo o primeiro um comportamento cíclico e os dois são os comportamentos do tipo oneshot. O comportamento cíclico imprime a cada dois segundos (a espera é devido ao sleep adicionado na linha 8), uma frase.
O primeiro comportamento oneshot, nomeado Teste1 possui 3 métodos:
- onStart: executa apenas uma vez logo que o comportamento é adicionado.
- onEnd: executa apenas uma vez logo que o comportamento é finalizado.
- _process: é o código principal do comportamento e também executa apenas uma vez. No código eu coloquei outro sleep para indicar um processamento mais demorado.
Dos métodos apresentados apenas o _process é obrigatório e é o único método implementado no comportamento Teste2. Observe uma diferença entre o processo dos comportamentos Teste1 e Teste2: no Teste2 o processo espera pelo recebimento de uma mensagem para o agente (linha 25) para somente depois dar continuidade ao processo e finalizar o comportamento. Como é um comportamento oneshot, isso significa que esse comportamento somente irá processar uma mensagem. Qualquer mensagens subsequentes enviadas ao agente não serão recebidas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import spade import time class Teste(spade.Agent.Agent): class M1(spade.Behaviour.Behaviour): def _process(self): print "Executou comportamento ciclico" time.sleep(2) class Teste1(spade.Behaviour.OneShotBehaviour): def onStart(self): print "Inicializando o comportamento..." def _process(self): print "Processo sendo feito..." time.sleep(7) print "Processo finalizado!" def onEnd(self): print "Tick off" class Teste2(spade.Behaviour.OneShotBehaviour): def _process(self): print "Espera mensagem..." msg = self._receive(True) print "Mensagem recebida!" def _setup(self): print "Agente criado" self.addBehaviour(self.M1()) self.addBehaviour(self.Teste1()) self.addBehaviour(self.Teste2()) teste = Teste("teste@127.0.0.1", "secret") teste.start() time.sleep(10) teste.stop() |
Aproveito para ilustrar outra situação com os métodos implementados. Apenas modifiquei o momento em que os comportamentos são adicionados. Veja que no código anterior eu adicionei todos os comportamentos no setup e dessa vez o comportamento Teste1 dentro do comportamento Teste2. Com essa modificação, somente quando uma mensagem for recebida pelo agente é que o comportamento Teste2 irá adicionar o comportamento Teste1 e ele será executado. O comportamento M1 continua executando de forma independente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import spade import time class Teste(spade.Agent.Agent): class M1(spade.Behaviour.Behaviour): def _process(self): print "Executou comportamento ciclico" time.sleep(2) class Teste1(spade.Behaviour.OneShotBehaviour): def onStart(self): print "Inicializando o comportamento..." def _process(self): print "Processo sendo feito..." time.sleep(7) print "Processo finalizado!" def onEnd(self): print "Tick off" class Teste2(spade.Behaviour.OneShotBehaviour): def _process(self): print "Espera mensagem..." msg = self._receive(True) print "Mensagem recebida!" self.addBehaviour(self.Teste1()) def _setup(self): print "Agente criado" self.addBehaviour(self.M1()) self.addBehaviour(self.Teste2()) teste = Teste("teste@127.0.0.1", "secret") teste.start() time.sleep(10) teste.stop() |
Pingback: Consulta ao AMS no SPADE – Professor Benjamin