Closed brownbytes closed 3 years ago
Currently you cannot spawn agents from a NameServer running in one machine to a different machine (remote spawning). So I don't think approach 1 will work.
Note that you can use ns_proxy.agents()
to list agents directly using the proxy (to simplify your scripts). That means, try to avoid using osbrain.nameserver.NameServer.agents(ns_proxy)
.
It seems you may be missing the a2_proxy.connect_to()
call. That could be the reason why it is not working.
@ Peque
I can confirm approach 1 did not work :-(. I tested approach 1 using 3 Raspberry Pi's and the approach failed. I am testing approach 2 and will recheck my scripts for missing connect calls?
Thank you
I feel so stupid. I did indeed did not call a2_proxy.connect_to(), this works ok now. Will still go and test this on Rpi and close the issue .
AgentAddress(ipc, /run/user/1000/.osbrain_ipc/ebb913321bd04de28d3f5762841ea74d, PUSH, server, pickle) Sending hello INFO [2021-05-24 09:03:59.318338] (agent1): Recieved:agent2 says hello! Sending hello
Hi Peque,
ns_proxy.proxy(agent_alias)
ran just fine when all agents were running on same machine.
But when I ran the agents on different machines, I hit n exception.
This has occurred while querying agent's proxy using nameserver.
so, when agent1 tries to connect to agent2 , in connect_to() a2_proxy = self.ns_proxy.proxy('agent2')
hit an exception, and nameserver.py hit an exception in step
for agent in agents_in_NS:
agent_proxy = ns_proxy.proxy(agent)
exception as below:
Traceback (most recent call last):
File "/home/durga/Desktop/ns.py", line 32, in <module>
main()
File "/home/durga/Desktop/ns.py", line 25, in main
ns_proxy.proxy(agent)
File "/usr/local/lib/python3.6/dist-packages/osbrain/proxy.py", line 355, in proxy
return Proxy(name, nsaddr=self.addr(), timeout=timeout)
File "/usr/local/lib/python3.6/dist-packages/osbrain/proxy.py", line 82, in __init__
while not self._ready_or_timeout(time0, timeout):
File "/usr/local/lib/python3.6/dist-packages/osbrain/proxy.py", line 98, in _ready_or_timeout
self.unsafe.ping()
File "/usr/local/lib/python3.6/dist-packages/osbrain/proxy.py", line 156, in __getattr__
return super().__getattr__(name)
File "/usr/local/lib/python3.6/dist-packages/Pyro4/core.py", line 275, in __getattr__
self._pyroGetMetadata()
File "/usr/local/lib/python3.6/dist-packages/Pyro4/core.py", line 615, in _pyroGetMetadata
self.__pyroCreateConnection()
File "/usr/local/lib/python3.6/dist-packages/Pyro4/core.py", line 596, in __pyroCreateConnection
connect_and_handshake(conn)
File "/usr/local/lib/python3.6/dist-packages/Pyro4/core.py", line 549, in connect_and_handshake
raise ce
Pyro4.errors.CommunicationError: cannot connect to ('localhost', 40729): [Errno 111] Connection refused
Update: I could fix the above error by passing the IP address in run_agent().
Though the above issue is now fixed - I still need some advice as the agents dont seem to exchange 'hellos' .
below are agents
Agent1.py
from osbrain import Agent
from osbrain import NSProxy
from osbrain import run_agent
import osbrain
import Pyro4
import time
import sys
class Agent1(Agent):
def on_init(self):
addr12=self.bind('PUSH',alias='agent12') #agent12 channel
def set_ns_proxy(self,ns_proxy):
self.ns_proxy = ns_proxy
def connect_to(self): #to listen to agent2's and agent3's pushed messages
#find remote agents proxies
print("connecting to agent2")
try:
a2_proxy = self.ns_proxy.proxy('agent2')
except:
print("Exception::ns_proxy.proxy('agent2')")
finally :
print(sys.exc_info()[0])
a2_addr = a2_proxy.addr('agent21')#addr takes alias of a socket
print(a2_proxy)
print(a2_addr)
self.connect(a2_addr,handler=self.custom_log) # listen to agent2
def send_hello(self,ch):
print("Sending hello")
self.send(ch,'agent1 says hello!') #ch is 'agent12' or 'agent13'
def custom_log(self,message):
self.log_info('Recieved:%s'%message)
def conn_NS(): # https://github.com/opensistemas-hub/osbrain/issues/341
ns_addr = '192.168.0.7:5020'
while True: # look for nameserver
try:
ns_proxy = NSProxy(ns_addr)
break
except Pyro4.errors.CommunicationError:
print('Pyr04.errors.CommunicationError,no nameserver found')
print('Trying again...')
pass
while True: # join nameserver
try:
# register with server
print("registering agent with server...")
a1_proxy = run_agent('agent1', base= Agent1, nsaddr=ns_addr, addr = '192.168.0.101')
a1_proxy.set_ns_proxy(ns_proxy)
# wait for proxy to set up
checkstatus = a1_proxy.get_attr('_running')
while checkstatus == False:
checkstatus = a1_proxy.get_attr('_running')
# verify that agent has registered successfully
agents_in_NS = ns_proxy.agents()
print('The following agents are in the server: %s' % agents_in_NS)
break
except KeyError:
print('Key Error')
print('Trying again...')
pass
except Pyro4.errors.CommunicationError:
print('Pyro4.errors.CommunicationError, no nameserver found')
print('Trying again...')
pass
except TimeoutError:
print('TimeoutError, no nameserver found')
print('Trying again...')
pass
print('a1 has joined the nameserver')
return a1_proxy
if __name__ == '__main__':
ns_addr = '192.168.0.7:5020'
ns_proxy = NSProxy(ns_addr)
a1_proxy = conn_NS()
agents_in_NS = ns_proxy.agents()
#agents_in_NS = ['agent2', 'agent3']
print(agents_in_NS)
a1_proxy.connect_to()
time.sleep(1)
for _ in range(3):
time.sleep(1)
a1_proxy.send_hello('agent12') # send hello on 'agent12' channel
Agent2.py
from osbrain import Agent
from osbrain import NSProxy
from osbrain import run_agent
import osbrain
import Pyro4
import time
from osbrain.proxy import Proxy
class Agent2(Agent):
def on_init(self):
addr21 = self.bind('PUSH',transport='tcp',alias='agent21')
def set_ns_proxy(self,ns_proxy):
self.ns_proxy = ns_proxy
def connect_to(self):
print("connecting to agent1 and agent2")
a1_proxy = self.ns_proxy.proxy('agent1')#find a1's proxy
a1_addr = a1_proxy.addr('agent12') # find a1's addr
self.connect(a1_addr, handler=self.custom_log) # listen to agent1
def send_hello(self,ch):
print("Sending hello")
self.send(ch,'agent2 says hello!') #ch is 'agent21' or 'agent23'
def custom_log(self,message):
self.log_info('Recieved:%s'%message)
def conn_NS(): # https://github.com/opensistemas-hub/osbrain/issues/341
ns_addr = '192.168.0.7:5020'
while True: # look for nameserver
try:
ns_proxy = NSProxy(ns_addr)
break
except Pyro4.errors.CommunicationError:
print('Pyr04.errors.CommunicationError,no nameserver found')
print('Trying again...')
pass
while True: # join nameserver
try:
# register with server
print("registering agent with server...")
a2_proxy = run_agent('agent2', base= Agent2, nsaddr=ns_addr, addr='192.168.0.12')
a2_proxy.set_ns_proxy(ns_proxy)
# wait for proxy to set up
checkstatus = a2_proxy.get_attr('_running')
print(a2_proxy)
while checkstatus == False:
checkstatus = a2_proxy.get_attr('_running')
# verify that agent has registered successfully
agents_in_NS = ns_proxy.agents()
print('The following agents are in the server: %s' % agents_in_NS)
break
except KeyError:
print('Key Error')
print('Trying again...')
pass
except Pyro4.errors.CommunicationError:
print('Pyro4.errors.CommunicationError, no nameserver found')
print('Trying again...')
pass
except TimeoutError:
print('TimeoutError, no nameserver found')
print('Trying again...')
pass
print('a2 agent has joined the nameserver')
return a2_proxy
if __name__ == '__main__':
ns_addr = '192.168.0.7:5020'
ns_proxy = NSProxy(ns_addr)
a2_proxy = conn_NS()
time.sleep(5)
agents_in_NS = ns_proxy.agents()
#agents_in_NS = ['agent1']
print(agents_in_NS)
a2_proxy.connect_to()
time.sleep(1)
for _ in range(3):
time.sleep(1)
a2_proxy.send_hello('agent21')
ns.py
from osbrain import run_nameserver
from osbrain.proxy import locate_ns,Proxy
import osbrain
import time
def main():
# Windows
# ns_sock = '127.0.0.1:1125'
# # Linux
ns_sock = '192.168.0.7:5020'
#ns_sock = '0.0.0.0:5020'
osbrain.config['TRANSPORT'] = 'tcp'
ns_proxy = run_nameserver(ns_sock)
ns_addr = locate_ns(ns_sock)
agents_in_NS = ns_proxy.agents()
while(len(agents_in_NS)<2):
agents_in_NS = ns_proxy.agents()
print('Current agents in Nameserver are: %s' %agents_in_NS)
for agent in agents_in_NS:
print(Proxy(agent))
time.sleep(1)
print('All agents have joined!')
if __name__ == '__main__':
main()
The agents are stuck at 'sending hello' state as before. agent1
registering agent with server...
The following agents are in the server: ['agent1']
a1 has joined the nameserver
['agent1', 'agent2']
connecting to agent2
error:: None
<osbrain.proxy.Proxy at 0x75dfd9b0; connected IPv4; for PYRONAME:agent2@192.168.0.7:5020>
AgentAddress(tcp, 192.168.0.12:44081, PUSH, server, pickle)
Sending hello
OKay!!! This is now fixed. I realised since transport wasn't set to 'tcp' while binding agent1, Agent2 was using IPC . Once I set both agent1 and agent2 to use transport='tcp', I can now see communication across devices.
Sorry, about spamming . Please delete the thread if it's unnecessary. Final(working) versions: agent1.py
from osbrain import Agent
from osbrain import NSProxy
from osbrain import run_agent
import osbrain
import Pyro4
import time
import sys
class Agent1(Agent):
def on_init(self):
addr12=self.bind('PUSH',alias='agent12',transport='tcp') #agent12 channel
def set_ns_proxy(self,ns_proxy):
self.ns_proxy = ns_proxy
def connect_to(self): #to listen to agent2's and agent3's pushed messages
#find remote agents proxies
print("connecting to agent2")
try:
a2_proxy = self.ns_proxy.proxy('agent2')
print(a2_proxy)
except:
print("Exception::ns_proxy.proxy('agent2')")
try:
a2_addr = a2_proxy.addr('agent21')#addr takes alias of a socket
print(a2_addr)
except:
print("failed to fetch a2_addr")
try:
self.connect(a2_addr,handler=self.custom_log) # listen to agent2
except:
print("failure to connect in connect_to method")
def send_hello(self,ch):
print("Sending hello")
self.send(ch,'agent1 says hello!') #ch is 'agent12' or 'agent13'
def custom_log(self,message):
self.log_info('Recieved:%s'%message)
def conn_NS(): # https://github.com/opensistemas-hub/osbrain/issues/341
ns_addr = '192.168.0.7:5020'
while True: # look for nameserver
try:
ns_proxy = NSProxy(ns_addr)
break
except Pyro4.errors.CommunicationError:
print('Pyr04.errors.CommunicationError,no nameserver found')
print('Trying again...')
pass
while True: # join nameserver
try:
# register with server
print("registering agent with server...")
a1_proxy = run_agent('agent1', base= Agent1, nsaddr=ns_addr, addr = '192.168.0.101')
a1_proxy.set_ns_proxy(ns_proxy)
# wait for proxy to set up
checkstatus = a1_proxy.get_attr('_running')
while checkstatus == False:
checkstatus = a1_proxy.get_attr('_running')
# verify that agent has registered successfully
agents_in_NS = ns_proxy.agents()
print('The following agents are in the server: %s' % agents_in_NS)
break
except KeyError:
print('Key Error')
print('Trying again...')
pass
except Pyro4.errors.CommunicationError:
print('Pyro4.errors.CommunicationError, no nameserver found')
print('Trying again...')
pass
except TimeoutError:
print('TimeoutError, no nameserver found')
print('Trying again...')
pass
print('a1 has joined the nameserver')
return a1_proxy
if __name__ == '__main__':
ns_addr = '192.168.0.7:5020'
ns_proxy = NSProxy(ns_addr)
a1_proxy = conn_NS()
time.sleep(5)
agents_in_NS = ns_proxy.agents()
#agents_in_NS = ['agent2', 'agent3']
print(agents_in_NS)
a1_proxy.connect_to()
time.sleep(10)
for _ in range(3):
time.sleep(2)
a1_proxy.send_hello('agent12') # send hello on 'agent12' channel
agent2.py
from osbrain import Agent
from osbrain import NSProxy
from osbrain import run_agent
import osbrain
import Pyro4
import time
from osbrain.proxy import Proxy
import sys
class Agent2(Agent):
def on_init(self):
addr21 = self.bind('PUSH',transport='tcp',alias='agent21')
def set_ns_proxy(self,ns_proxy):
self.ns_proxy = ns_proxy
def connect_to(self):
print("connecting to agent1")
try:
a1_proxy = self.ns_proxy.proxy('agent1')#find a1's proxy
print(a1_proxy)
except:
print("exception::ns_proxy.proxy('agent1')")
try:
a1_addr = a1_proxy.addr('agent12') # find a1's addr
print(a1_addr)
except:
print("failed to fetch addr")
try:
self.connect(a1_addr, handler=self.custom_log) # listen to agent1
except:
print("failed to connect in connect_to()")
def send_hello(self,ch):
print("Sending hello")
self.send(ch,'agent2 says hello!') #ch is 'agent21' or 'agent23'
def custom_log(self,message):
self.log_info('Recieved:%s'%message)
def conn_NS(): # https://github.com/opensistemas-hub/osbrain/issues/341
ns_addr = '192.168.0.7:5020'
while True: # look for nameserver
try:
ns_proxy = NSProxy(ns_addr)
break
except Pyro4.errors.CommunicationError:
print('Pyr04.errors.CommunicationError,no nameserver found')
print('Trying again...')
pass
while True: # join nameserver
try:
# register with server
print("registering agent with server...")
a2_proxy = run_agent('agent2', base= Agent2, nsaddr=ns_addr, addr='192.168.0.12')
a2_proxy.set_ns_proxy(ns_proxy)
# wait for proxy to set up
checkstatus = a2_proxy.get_attr('_running')
print(a2_proxy)
while checkstatus == False:
checkstatus = a2_proxy.get_attr('_running')
# verify that agent has registered successfully
agents_in_NS = ns_proxy.agents()
print('The following agents are in the server: %s' % agents_in_NS)
break
except KeyError:
print('Key Error')
print('Trying again...')
pass
except Pyro4.errors.CommunicationError:
print('Pyro4.errors.CommunicationError, no nameserver found')
print('Trying again...')
pass
except TimeoutError:
print('TimeoutError, no nameserver found')
print('Trying again...')
pass
print('a2 agent has joined the nameserver')
return a2_proxy
if __name__ == '__main__':
ns_addr = '192.168.0.7:5020'
ns_proxy = NSProxy(ns_addr)
a2_proxy = conn_NS()
time.sleep(5)
agents_in_NS = ns_proxy.agents()
#agents_in_NS = ['agent1']
print(agents_in_NS)
a2_proxy.connect_to()
time.sleep(10)
for _ in range(3):
time.sleep(2)
a2_proxy.send_hello('agent21')
Good to know! :blush:
Hi,
I am trying out dploying agents on multiple physical devices. Below are two approaches that I took:
Approach 1--- Agentns.py
Agent1.py
Agent2.py
Result:
Approach 2 : Taking cue from https://github.com/opensistemas-hub/osbrain/issues/341
Agentns.py
Agent1.py
Agent2.py
Output:
As can be seen , I dont see hellos exchanged if I take approach-2. I can't quite figure out why approach-2 fails. Also, can I proceed with approach1. That is - assign IP addresses to agents and start entire MAS setup in NS?
Thank you.