我正在尝试实现一个Producer-Consumer
模式,该模式使用多代理作为工作器而不是多线程。
据我了解,典型的多线程实现使用BlockingQueue
,其中一个Producer
线程将信息放入队列,并有多个Consumer
线程提取数据并执行某些处理功能。
因此,按照相同的逻辑,我的设计将使用一个Producer
代理来生成数据并将其发送到多个Consumer
代理。乍一看,我认为我应该在BlockingQueue
代理之间使用 shared Consumer
,并使代理访问队列并检索数据。但是我不知道这样做是否容易,因为我不认为座席有任何共享内存,并且将信息直接发送给Consumer
座席更简单。 ACL消息。
要考虑这一点很重要,因为我的多主体设计将处理大量数据。所以我的问题是,在Jade中,如果我向一个代理发送许多ACL消息,会发生什么情况?代理会忽略其他消息吗?
此post的答案建议为“。在JADE框架中,代理具有ACLMessages的“收件箱”,基本上是一个BlockingQueue对象,其中包含收到的消息列表。观察自己的列表并将其作为生命周期进行处理。容器不具备此功能...” 。那句话正确吗?如果是这样,则其他消息仅在队列中等待,这对我的设计来说是将信息直接发送到Consumer
代理的理想选择,但是我没有看到BlockingQueues
上的任何消息。 ACLMessage类。
答案 0 :(得分:2)
是的,邮件将在队列中,代理不会忽略它们。
...
>> let inputPipe = Pipe()
>> task.standardInput = inputPipe
task.launch()
>> inputPipe.fileHandleForWriting.write("text to send to java program".data(using: String.Encoding.utf8)
...
只是一个消息对象,在代理之间发送。每个代理都有自己的消息队列(ACLMessage
)和几种处理通信的方法。
如果您查看jade.core.MessageQueue
类文档,则可以找到类似的方法
Agent
-非阻塞接收,返回队列中的第一条消息;如果队列为空,则返回receive()
null
-的行为与上一个类似,但是您也可以指定消息的模式,例如特定的发件人AID,对话ID以及组合。receive(MessageTemplate pattern)
-阻止接收,阻止代理,直到消息出现在队列中blockingReceive()
-使用模式阻止接收,还有一些阻止接收的方法,您可以在其中设置超时时间。
值得一提的是,如果您在blockingReceive(MessageTemplate pattern)
类中定义代理逻辑,则也可以仅阻止行为,而不是阻止整个代理。
Behaviour
区别在于,行为内部的ACLMessage msg = agent.receive();
if (msg != null) {
// your logic
} else {
block();
}
方法只是将您的行为标记为已阻止,并将其从代理的活动行为池中删除(当收到消息或行为被{{1 }}方法)允许执行其他座席的行为,block()
会完全阻止您的座席及其所有行为,直到他收到消息为止。