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

Skip to content

Commit 82dcbc2

Browse files
committed
Merge branch 'danielrowles-wf-safe-on-close-if'
2 parents f958099 + b198b89 commit 82dcbc2

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

tests/test_buffered_channel.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,3 +445,61 @@ def _do_with_assert_raises():
445445
finally:
446446
client.close()
447447
server.close()
448+
449+
450+
def test_on_close_if():
451+
"""
452+
Test that the on_close_if method does not cause exceptions when the client
453+
is slow to recv() data.
454+
"""
455+
endpoint = random_ipc_endpoint()
456+
server_events = zerorpc.Events(zmq.ROUTER)
457+
server_events.bind(endpoint)
458+
server = zerorpc.ChannelMultiplexer(server_events)
459+
460+
client_events = zerorpc.Events(zmq.DEALER)
461+
client_events.connect(endpoint)
462+
client = zerorpc.ChannelMultiplexer(client_events, ignore_broadcast=True)
463+
464+
client_channel = client.channel()
465+
client_hbchan = zerorpc.HeartBeatOnChannel(client_channel, freq=2)
466+
client_bufchan = zerorpc.BufferedChannel(client_hbchan, inqueue_size=10)
467+
468+
event = server.recv()
469+
server_channel = server.channel(event)
470+
server_hbchan = zerorpc.HeartBeatOnChannel(server_channel, freq=2)
471+
server_bufchan = zerorpc.BufferedChannel(server_hbchan, inqueue_size=10)
472+
473+
seen = []
474+
475+
def is_stream_done(event):
476+
return event.name == 'done'
477+
478+
def client_do():
479+
while True:
480+
event = client_bufchan.recv()
481+
if event.name == 'done':
482+
return
483+
seen.append(event.args)
484+
gevent.sleep(0.1)
485+
486+
def server_do():
487+
for i in range(0, 10):
488+
server_bufchan.emit('blah', (i))
489+
server_bufchan.emit('done', ('bye'))
490+
491+
client_bufchan.on_close_if = is_stream_done
492+
493+
coro_pool = gevent.pool.Pool()
494+
g1 = coro_pool.spawn(client_do)
495+
g2 = coro_pool.spawn(server_do)
496+
497+
g1.get() # Re-raise any exceptions...
498+
g2.get()
499+
500+
assert seen == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
501+
502+
client_bufchan.close()
503+
server_bufchan.close()
504+
client.close()
505+
server.close()

zerorpc/channel.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,10 @@ def _request_data(self):
242242
self._channel.emit('_zpc_more', (open_slots,))
243243

244244
def recv(self, timeout=None):
245-
if self._verbose:
245+
# self._channel can be set to None by an 'on_close_if' callback if it
246+
# sees a suitable message from the remote end...
247+
#
248+
if self._verbose and self._channel:
246249
if self._input_queue_reserved < self._input_queue_size / 2:
247250
self._request_data()
248251
else:

0 commit comments

Comments
 (0)