Category Archives: Agents

Agents in AjTalk: Introduction

I extended my AjTalk Smalltalk-like interpreted VM, written in C#, to support the ideas I have implemented for AjSharp:

Agents in AjSharp (Part 1)
Agents in AjSharp (Part 2)
Web Crawler using Agents in AjSharp

and in AjAgents:

AjAgents: a new implementation

Usually, you send a message (its symbol name, arguments) from a sender to a receiver:

The receiver got the message and processes it. Meanwhile, the sender is waiting a result, or the end of processing, at least. But I want to explore another way of doing things: send the message, and leaves it. The sender could continue with its own processing. This way is similar to living systems: a neuron sends a “message” to another neuron, and then this neuron could send or not more “messages” to another neurons. A parallel processing emerges from all this decoupled activity: it’s a form of message passing, a kind of “tell, don’t ask”, or “hey, this is my message, do something good with it, when you have time, but I don’t care of your answer, now”.

Then, I wrote an extension to AjTalk. You can define an agent subclass using:

Object agent: #MyAgent.

You can define methods for the new subclass MyAgent. But when you create and use once of its instances:

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

the message is sent to the agent, BUT it is not immediately processed. It is put in a queue. Agent process the message from that queue, using another thread (I could implement a message queue to be consumed by a thread pool of fixed size, in order to serve a large number of agents; actually, there is a thread/queue by agent):

Actually, the queue is a blocking one: if it is filled by messages to process, a new arrival message blocks the sender thread. I could implement other strategies for message throttling. The C# classes that implements all this behavior are BaseAgent (overriding the ExecuteMethod method):

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

and MessageQueue (a blocking queue implementation for message). You can download the current AjTalk source code from trunk at http://code.google.com/p/ajtalk/.

My idea is to write a use case for this kind of agents: my classical web crawler, or something simpler. I have distributed objects, too. I could combine these two features: a distributed web crawler, maybe.

Keep tuned!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez