Dynamically allocate port

pull/18312/head
Richard Belleville 6 years ago
parent f2c7ffc9fb
commit a6c33d3516
  1. 38
      examples/python/multiprocessing/server.py

@ -18,6 +18,7 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from concurrent import futures from concurrent import futures
import contextlib
import datetime import datetime
import grpc import grpc
import logging import logging
@ -25,6 +26,7 @@ import math
import multiprocessing import multiprocessing
import os import os
import time import time
import socket
import prime_pb2 import prime_pb2
import prime_pb2_grpc import prime_pb2_grpc
@ -61,6 +63,7 @@ def _wait_forever(server):
def _run_server(bind_address): def _run_server(bind_address):
"""Start a server in a subprocess."""
logging.warning( '[PID {}] Starting new server.'.format( os.getpid())) logging.warning( '[PID {}] Starting new server.'.format( os.getpid()))
options = (('grpc.so_reuseport', 1),) options = (('grpc.so_reuseport', 1),)
@ -80,17 +83,32 @@ def _run_server(bind_address):
_wait_forever(server) _wait_forever(server)
@contextlib.contextmanager
def _reserve_port():
"""Find and reserve a port for all subprocesses to use."""
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind(('', 0))
try:
yield sock.getsockname()[1]
finally:
sock.close()
def main(): def main():
workers = [] with _reserve_port() as port:
for _ in range(_PROCESS_COUNT): bind_address = '[::]:{}'.format(port)
# NOTE: It is imperative that the worker subprocesses be forked before logging.warning("Binding to {}".format(bind_address))
# any gRPC servers start up. See workers = []
# https://github.com/grpc/grpc/issues/16001 for more details. for _ in range(_PROCESS_COUNT):
worker = multiprocessing.Process(target=_run_server, args=(_BIND_ADDRESS,)) # NOTE: It is imperative that the worker subprocesses be forked before
worker.start() # any gRPC servers start up. See
workers.append(worker) # https://github.com/grpc/grpc/issues/16001 for more details.
for worker in workers: worker = multiprocessing.Process(target=_run_server, args=(bind_address,))
worker.join() worker.start()
workers.append(worker)
for worker in workers:
worker.join()
if __name__ == '__main__': if __name__ == '__main__':

Loading…
Cancel
Save