Сервер Python gRPC не запускается

Я создал сервер gRPC, используя proto3 и python, чтобы выполнить базовую проверку работоспособности долго работающего демона. Однако когда я запускаю свое приложение, оно фактически не запускает сервер gRPC. Мне было интересно, может ли кто-нибудь помочь определить, почему он не запускается и не обслуживает API gRPC

Протоопределение: health.proto

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.redacted.example.worker";
option java_outer_classname = "ExampleWorker";
option objc_class_prefix = "DSW";

package exampleworker;

service Worker {
  rpc Health (Ping) returns (Pong) {}
}

// The request message containing PONG
message Ping {
  string message = 1;
}

// The response message containing PONG
message Pong {
  string message = 1;
}

Затем я сгенерировал код Python, используя:

python -m grpc_tools.protoc -I=../protos --python_out=. --grpc_python_out=. ../protos/health.proto

Это сгенерировало файлы health_pb2.py и health_pb2_grpc.py. Затем я создал файл сервера:

u"""Health server is used to create a new health monitoring GRPC server."""

from concurrent import futures
import logging
import grpc
import health_pb2
import health_pb2_grpc

# grpc related variables
grpc_host = u'[::]'
grpc_port = u'50001'
grpc_address = u'{host}:{port}'.format(host=grpc_host, port=grpc_port)
# logging related variables
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)


class WorkerServicer(health_pb2_grpc.WorkerServicer):
    u"""Provides methods that implement functionality of health server."""

    def Health(self, request, context):
        u"""Return PONG to say the Worker is alive."""
        return health_pb2.Pong(message='PONG')


def serve_health_api():
    u"""Create and start the GRPC server."""
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    health_pb2_grpc.add_WorkerServicer_to_server(WorkerServicer(), server)
    logging.info(u'adding port {grpc_address}'.format(
        grpc_address=grpc_address))
    server.add_insecure_port(grpc_address)
    server.start()

Затем в моем основном файле run.py:

#!mac/bin/python

"""Run is the local (non-wsgi) entrypoint to the flask application."""

from subscriber.worker import Worker
from redis import StrictRedis
from examplegrpc.health_server import serve_health_api
import logging

redis_host = 'localhost'
redis_port = 6379
redis_db = 0
redis_chan = 'deployment'

if __name__ == "__main__":
    FORMAT = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s'
    logging.basicConfig(format=FORMAT)
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)

    logger.debug('Creating redis client')
    client = StrictRedis(host=redis_host, port=redis_port, db=redis_db)
    w = Worker(client, [redis_chan])
    try:
        logger.info('Starting Health gRPC API...')
        serve_health_api()
        logger.info('Starting worker...')
        w.run()
    except KeyboardInterrupt:
        logger.info('Exiting...')

W.run () запускается правильно для выполнения работы из канала Redis, но сервер gRPC не запускается, пытаясь получить к нему доступ с помощью

channel = grpc.insecure_channel('localhost:{port}'.format(port=grpc_port))
stub = WorkerStub(channel)
ping = examplegrpc.health_pb2.Ping(message='PING')
health = stub.Health(ping)

начинается

_Rendezvous: <_Rendezvous of RPC that terminated with (StatusCode.UNAVAILABLE, Connect Failed)>

person kkirsche    schedule 12.04.2017    source источник


Ответы (1)


Мне кажется, что происходит то, что ваш сервер назначается только локальному полю в вашей функции serve_health_api, поэтому, когда эта функция возвращается (сразу после запуска сервера), сервер собирает мусор и завершает работу.

person Nathaniel Manista At Google    schedule 13.04.2017
comment
Вот и все! Большое спасибо за ваш ответ и помощь. я очень ценю это - person kkirsche; 14.04.2017