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.
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.
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