Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9b9cfa0

Browse files
committed
req-context, handle early close request
1 parent ec1bcd3 commit 9b9cfa0

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

zerorpc/core.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
class ServerBase(object):
4444

4545
def __init__(self, channel, methods=None, name=None, context=None,
46-
pool_size=None, heartbeat=5):
46+
pool_size=None, heartbeat=5, allow_remote_stop=False):
4747
self._multiplexer = ChannelMultiplexer(channel)
4848

4949
if methods is None:
@@ -58,6 +58,9 @@ def __init__(self, channel, methods=None, name=None, context=None,
5858
self._inject_builtins()
5959
self._heartbeat_freq = heartbeat
6060

61+
if allow_remote_stop:
62+
self._methods['_zerorpc_stop'] = self.stop
63+
6164
for (k, functor) in self._methods.items():
6265
if not isinstance(functor, DecoratorBase):
6366
self._methods[k] = rep(functor)

zerorpc/patterns.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ def process_call(self, context, bufchan, event, functor):
7777
context_gen =context.middleware_call_procedure(functor, *event.args)
7878
methods = context_gen.next()
7979
wchannel = WrappedEvents(bufchan)
80-
server = core.ServerBase(wchannel, methods, heartbeat=None)
80+
server = core.ServerBase(wchannel, methods, heartbeat=None,
81+
allow_remote_stop=True)
8182
bufchan.emit('CTX', (None,))
8283
try:
8384
server.run()
@@ -105,13 +106,32 @@ def process_answer(self, context, bufchan, event, method,
105106
wchannel = WrappedEvents(bufchan)
106107

107108
class ContextClient(core.ClientBase):
109+
def __init__(self, channel):
110+
self._closed = False
111+
super(ContextClient, self).__init__(channel, heartbeat=None)
112+
108113
def close(self):
109-
self._channel.emit('CTX_CLOSE', (None,))
114+
if self._closed:
115+
return
116+
self('_zerorpc_stop')
110117
super(ContextClient, self).close()
118+
wchannel.close()
111119
bufchan.close()
112120
bufchan.channel.close()
113121
bufchan.channel.channel.close()
122+
self._closed = True
123+
124+
def __call__(self, method, *args, **kargs):
125+
if self._closed:
126+
raise ValueError('I/O operation on closed context')
127+
return super(ContextClient, self).__call__(method, *args, **kargs)
128+
129+
def __enter__(self):
130+
return self
131+
132+
def __exit__(self, *args):
133+
self.close()
114134

115-
return ContextClient(wchannel, heartbeat=None)
135+
return ContextClient(wchannel)
116136

117137
patterns_list = [ReqContext(), ReqStream(), ReqRep()]

0 commit comments

Comments
 (0)