Tell me please: how from service RPyC server refer to the Service specific
client.
*CORE*
class CoreService(rpyc.Service):
"""
Сервис услуг Ядра системы (набор функций, которые можно вызвать
удаленно)
"""
__modules = {}
def __del__(self):
pass
def on_connect(self):
pass
def on_disconnect(self):
for key, value in self.__modules.items():
if id(value) == id(self._conn):
del self.__modules[key]
break
def exposed_register_module(self, module_name):
if module_name in self.__modules:
return False
self.__modules[module_name] = self._conn
return True
def exposed_module_is_connected(self, module_name):
if module_name in self.__modules:
return True
return False
def exposed_execute_query_module(self, module_name, attribute_name, args
):
print '=========================='
print 'MODULE QUERY FROM MODULE:'
print module_name
print attribute_name
print args
print self._conn
print '=========================='
# TTTTTTTTTTHHHHHHHHHIIIIIIIISSSSSSSSSSSSSS
if module_name in self.__modules:
self.__modules[module_name].root
# return None
class Core():
"""
Ядро системы Perseus
"""
__server = None
def __init__(self):
pass
def __del__(self):
self.stop_core()
def start_core(self, address='127.0.0.1', port=33000):
"""
Запуск ядра
:param address: IP адресс модуля
:return: Результат запуска системы
:rtype: bool
"""
self.__server = ThreadedServer(hostname=address, port=port, service=
CoreService)
core_server_thread = threading.Thread(name='core_server_thread',
target=self.__server.start)
core_server_thread.setDaemon(True)
core_server_thread.start()
return True
def stop_core(self):
"""
Функция останавливает Ядро
:return:
"""
self.__server.close()
MODULE
class Module():
"""
"""
__core_connection = None
def __init__(self):
pass
def __del__(self):
self.close()
def connect_to_core(self, address='127.0.0.1', port=33000,
module_service=rpyc.VoidService):
"""
:param address: Адрес, на котором запущено Ядро
:param port: Порт, на котором запущено Ядро
:return: Результат подключения
:rtype: bool
"""
self.__core_connection = rpyc.connect(host=address, port=port,
service=module_service)
if not self.__register_module_in_core(module_service.get_module_name
()):
self.__core_connection.close()
return False
return True
def __register_module_in_core(self, module_name):
"""
Удаленно регистрирует текущий модуль в Ядре
:return:
"""
return self.__core_connection.root.register_module(module_name)
def close(self):
if self.__core_connection is not None:
self.__core_connection.close()
self.__core_connection = None
def get_module(self, module_name):
if self.__core_connection is None:
return None
if self.__core_connection.root.module_is_connected(module_name) is
not None:
return ModuleProxy(core_connector=self.__core_connection,
proxy_module_name=module_name)
return None
class ModuleProxy():
__core_connector = None
__proxy_module_name = None
def __init__(self, core_connector, proxy_module_name):
self.__core_connector = core_connector
self.__proxy_module_name = proxy_module_name
def __getattr__(self, name, *args):
print name
print args
if self.__core_connector is None:
return None
return self.__core_connector.root.execute_query_module(self.
__proxy_module_name, name, args)
class ModuleService(rpyc.Service):
"""
Сервис услуг Модуля системы (набор функций, которые можно вызвать
удаленно)
"""
@staticmethod
def get_module_name():
return 'AbstractModuleService'
TEST
def test_module_interaction(self):
test_core = core.Core()
self.assertTrue(test_core.start_core(port=33003))
test_module1 = module.Module()
self.assertTrue(test_module1.connect_to_core(port=33003,
module_service=TestModuleService1))
test_module2 = module.Module()
self.assertTrue(test_module2.connect_to_core(port=33003,
module_service=TestModuleService2))
remote_module_2 = test_module1.get_module(TestModuleService2.
get_module_name())
self.assertIsNotNone(remote_module_2)
self.assertEqual(remote_module_2.test(), TestModuleService2.
exposed_test())
When you run the test I get in into a loop which is interrupted by a
combination of keys and get the following output:
test
()
==========================
MODULE QUERY FROM MODULE:
TestModule2
test
()
<rpyc.core.protocol.Connection 'conn2' object at 0x7f64e0992490>
==========================
^CTraceback (most recent call last):
File "run_tests.py", line 10, in <module>
unittest.TextTestRunner().run(unittest.TestLoader().
loadTestsFromTestCase(test_interaction.TestInteraction))
File "/usr/lib/python2.7/unittest/runner.py", line 151, in run
test(result)
File "/usr/lib/python2.7/unittest/suite.py", line 70, in __call__
return self.run(*args, **kwds)
File "/usr/lib/python2.7/unittest/suite.py", line 108, in run
test(result)
File "/usr/lib/python2.7/unittest/case.py", line 395, in __call__
return self.run(*args, **kwds)
File "/usr/lib/python2.7/unittest/case.py", line 331, in run
testMethod()
File "/home/kpv/perseus/control-lib/tests/test_interaction.py", line 90,
in test_module_interaction
self.assertEqual(remote_module_2.test(), TestModuleService2.exposed_test
())
File "/home/kpv/perseus/control-lib/perseus_control_lib/module.py", line
67, in __getattr__
return self.__core_connector.root.execute_query_module(self.
__proxy_module_name, name, args)
File "/usr/local/lib/python2.7/dist-packages/rpyc/core/netref.py", line
196, in __call__
return syncreq(_self, consts.HANDLE_CALL, args, kwargs)
File "/usr/local/lib/python2.7/dist-packages/rpyc/core/netref.py", line 71
, in syncreq
return conn.sync_request(handler, oid, *args)
File "/usr/local/lib/python2.7/dist-packages/rpyc/core/protocol.py", line
438, in sync_request
self.serve(0.1)
File "/usr/local/lib/python2.7/dist-packages/rpyc/core/protocol.py", line
387, in serve
data = self._recv(timeout, wait_for_lock = True)
File "/usr/local/lib/python2.7/dist-packages/rpyc/core/protocol.py", line
344, in _recv
if self._channel.poll(timeout):
File "/usr/local/lib/python2.7/dist-packages/rpyc/core/channel.py", line
43, in poll
return self.stream.poll(timeout)
File "/usr/local/lib/python2.7/dist-packages/rpyc/core/stream.py", line 41
, in poll
rl, _, _ = select([self], [], [], timeout)
KeyboardInterrupt
--
---
You received this message because you are subscribed to the Google Groups
"rpyc" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.