Agentes en AjTalk: Introducción

Extendí mi proyecto AjTalk (una virtual machine interpretada tipo Smalltalk, escrite en C#), para soportar algunas ideas que ya había implementado en AjSharp:

Agents in AjSharp (Part 1)
Agentes en AjSharp (Parte 1)
Agents in AjSharp (Part 2)
Agentes en AjSharp (Parte 2)
Web Crawler using Agents in AjSharp
Web Crawler usando Agentes en AjSharp

y en AjAgents:

AjAgents: a new implementation
AjAgents: una nueva implementación

Usualmente, enviamos un mensaje (su nombre como símbolo, y argumentos) desde un objeto “sender” (enviador) a un “receiver” (receptor):

El receptor toma el mensaje y lo procesa. Mientras tanto, el enviador está esperando el resultado, o al menos, el final del procesamiento. Pero quiero explorar otra manera de hacer las cosas: enviar el mensaje, y olvidarse. El enviador continuaría con su propio proceso. De esta manera se parece a los sistemas vivos: una neurona envía un “mensaje” a otra neurona, y entonces esta neurona puede enviar o no más “mensajes” a otras neuronas. El procesamiento en paralelo emerge de esta actividad desacoplada: es una forma de “message passing”, un tipo de “tell, don’t ask”, o de “Ey! Este es mi mensaje, haz algo bueno con él, cuando puedas y tengas tiempo, pero no me importa recibir una respuesta”.

Para tener todo esto, escribí dos clases en AjTalk, y algo de sintaxis. Podemos definir una subclase que produce agentes usando:

Object agent: #MyAgent.

Podemos definir métodos en la nueva clase MyAgent. Cuando creamos una instancia y la usamos:

myAgent := MyAgent new.
myAgent doSomethingWith: par1 andWith: par2.

el mensaje es enviado al agente, PERO no es procesado en el thread del enviador. Sólo es puesto en una cola. El agente procesa el mensaje desde esa cola, usando otro thread (ahora hay una cola y thread por agente, podría reimplementarlo para que hubiera una cola compartida entre varios agentes, y un pool de threads):

En la implementación actual, la cola es una cola bloqueante, tiene un tamaño máximo: cuando no hay más lugar, el arrivo de un nuevo mensaje bloquea al thread enviador. Podría implementar otras estrategias para tratar demasiados mensajes (descartar los nuevos, descartar los viejos, etc…). Por ahora, esta estrategia bloqueante me sirve, para ir coordinando distintos agentes.

Las clase C# que implementan esta conducta son BaseAgent (que es un BaseObject que sobreescribe el método ExecuteMethod):

public override object ExecuteMethod(IMethod method, object[] arguments)
{
    Message message = new Message(method, arguments);
    this.queue.PostMessage(message);
    return null;    // TODO what to return?
}


y un MessageQueue. Pueden descargar el código actual de AjTalk desde el trunk en http://code.google.com/p/ajtalk/.



Mi idea es escribir un caso de uso para este tipo de agentes: podría ser mi “clásico” ejemplo de web crawler, o algo más simple (recuerden que no tengo una librería de clases AjTalk, todavía, pero podría aporvecharme de todo .NET). Tengo objetos distribuidos, también: próximo post será sobre ese tema. Podría llegar a combinar las dos: armar un web crawler distribuido.



Nos leemos!



Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 11722, 1389, 15035, 3462, 8870. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>