Skip to content
This repository was archived by the owner on Feb 22, 2020. It is now read-only.

Commit 0bb0082

Browse files
authored
Merge pull request #305 from gnes-ai/feat-max-pending
feat(frontend): add max pending request to frontend
2 parents 946df39 + bbf1ed8 commit 0bb0082

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

gnes/cli/parser.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,8 @@ def set_frontend_parser(parser=None):
330330
help='maximum concurrent connections allowed')
331331
parser.add_argument('--dump_route', type=argparse.FileType('w', encoding='utf8'),
332332
help='dumping route information to a file')
333+
parser.add_argument('--max_pending_request', type=int, default=100,
334+
help='maximum number of pending requests allowed, when exceed wait until we receive the response')
333335
return parser
334336

335337

gnes/service/frontend.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import grpc
2121
from google.protobuf.json_format import MessageToJson
2222

23-
from .. import __version__, __proto_version__
2423
from ..client.base import ZmqClient
2524
from ..helper import set_logger, make_route_table
2625
from ..proto import gnes_pb2_grpc, gnes_pb2, router2str, add_route, add_version
@@ -59,6 +58,7 @@ def __init__(self, args):
5958
check_version=self.args.check_version,
6059
timeout=self.args.timeout,
6160
squeeze_pb=self.args.squeeze_pb)
61+
self.pending_request = 0
6262

6363
def add_envelope(self, body: 'gnes_pb2.Request', zmq_client: 'ZmqClient'):
6464
msg = gnes_pb2.Message()
@@ -104,21 +104,27 @@ def Search(self, request, context):
104104
return self.Call(request, context)
105105

106106
def StreamCall(self, request_iterator, context):
107+
self.pending_request = 0
108+
109+
def get_response(num_recv, blocked=False):
110+
for _ in range(num_recv):
111+
if blocked or zmq_client.receiver.poll(1):
112+
msg = zmq_client.recv_message(**self.send_recv_kwargs)
113+
self.pending_request -= 1
114+
yield self.remove_envelope(msg)
115+
107116
with self.zmq_context as zmq_client:
108-
num_request = 0
109117

110118
for request in request_iterator:
111119
zmq_client.send_message(self.add_envelope(request, zmq_client), **self.send_recv_kwargs)
112-
num_request += 1
120+
self.pending_request += 1
113121

114-
if zmq_client.receiver.poll(1):
115-
msg = zmq_client.recv_message(**self.send_recv_kwargs)
116-
num_request -= 1
117-
yield self.remove_envelope(msg)
122+
num_recv = max(self.pending_request - self.args.max_pending_request, 1)
123+
124+
# switch to blocked recv when too many pending requests
125+
yield from get_response(num_recv, num_recv > 1)
118126

119-
for _ in range(num_request):
120-
msg = zmq_client.recv_message(**self.send_recv_kwargs)
121-
yield self.remove_envelope(msg)
127+
yield from get_response(self.pending_request, blocked=True)
122128

123129
class ZmqContext:
124130
"""The zmq context class."""

0 commit comments

Comments
 (0)