RPyC Memory Connect
RpycMemConnect
is a wrapper around rpyc.connect to connect with RpycMemService
. RpycMemConnect
performs some basic error recovery
and validations.
import rpyc
from rpyc_mem.connect import RpycMemConnect
"""
Assuming RpycMemService running on localhost:18813
Defaults: max_retry=4
retry_delay=3
ignore_version=False
"""
rc = RpycMemConnect('localhost', 18813)
print(rc.rpyc_version()) # (5, 1, 0)
print(rpyc.__version__ == rc.rpyc_version()) # True
print(rc.root.memoize == rc.memoize) # True
print(rc.is_memoized('not_memoized')) # False
RPyC
warns against having
different versions for client and server; when the ignore_version
is False
, having different versions will raise
an exception during __init__
. The attributes that are not defined by RpycMemConnect
are searched in the underlying
RPyC connection object, Ex: rc.root
will invoke getattr(self.rpyc_conn, 'root')
. The RpycMemService
attributes can be accessed as if they were defined under RpycMemConnect
namespace, Ex: rc.memoize == rc.root.memoize
RpycMemConnect
performs some basic error recovery as configured by max_retry
and retry_delay
. If you want to
bypass this you can work with raw connection object rc.rpyc_conn
. RpycMemConnect
has these additional attributes:
rc.setup_rmem_conn()
- Re-setup the connection (attempt-close and open).
rc.rmem_except_handler()
- Function decorator for handling the connection errors when working with raw connection object
rc.close()
- Close the underlying RPyC connection. Connection errors are no more handled (until the connection is re-setup)
The following snippet shows their usage:
from rpyc_mem.connect import RpycMemConnect
rc = RpycMemConnect('localhost', 18813, max_retry=1)
rc.close()
# Working with raw connection object
try:
rc.rpyc_conn.root.rpyc_version()
except EOFError:
rc.setup_rmem_conn() # Re-setup the connection ([attempt] close and open)
print(rc.rpyc_conn.root.rpyc_version())
# Recovery from connection failures
rc.rpyc_conn.close() # With rc.close() connection errors are no more handled
print(rc.rpyc_version())
# Using exception handlers when working with raw connection object
rc.rpyc_conn.close()
def reconnect_hook():
print('re-connected')
@rc.rmem_except_handler(on_reconnect=reconnect_hook)
def rmem_fn():
"""Function that uses rpyc connection object"""
print(rc.rpyc_conn.root.is_memoized('not_memoized'))
rmem_fn()
"""
Output:
(5, 1, 0)
(5, 1, 0)
re-connected
False
"""