Сервер Python gRPC не прослушивает указанный порт - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь создать сервер-клиентское приложение Python gRPC, следуя этому примеру , но я не могу перевести сервер в своем коде в состояние прослушивания.После добавления кода, почти равного приведенному в примере, и запуска метода start, все еще ничего не прослушивает указанный порт.Мой код:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import grpc
import interface_pb2
import interface_pb2_grpc
from concurrent import futures
import time
# some other imports...

class GrpcInterface(interface_pb2_grpc.ManipulaMapaServicer):
    def CriaItem(self, request, context):
        # do stuff...

    def LeItem(self, request, context):
        # do stuff...

    def AtualizaItem(self, request, context):
        # do stuff...

    def DeletaItem(self, request, context):
        # do stuff...

_ONE_DAY_IN_SECONDS = 60 * 60 * 24

def main():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    interface_pb2_grpc.add_ManipulaMapaServicer_to_server(GrpcInterface(), server)
    print('Vai iniciar o servidor gRPC na porta ' + str(8888))
    server.add_insecure_port('[::]:' + str(8888))
    server.start()
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)

if __name__ == '__main__':
    try:
        main()
    except Exception as e:
        print('Erro ao rodar servidor: ')
        print(str(e))

Код для interface_pb2_grpc.ManipulaMapaServicer, конечно, генерируется автоматически (с помощью команды python3 -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. interface.proto) на основе моего interface.proto:

syntax = "proto3";

message msgItem {
    int64 chave = 1;
    string valor = 2;
}

message status {
    string resposta = 1; 
    msgItem itemResposta = 2; 
}

service ManipulaMapa {
    rpc CriaItem (msgItem) returns (status) {}
    rpc LeItem (msgItem) returns (msgItem) {}
    rpc AtualizaItem (msgItem) returns (status) {}
    rpc DeletaItem (msgItem) returns (status) {}
}

Выполнениедостигает цикла while True: внутри main, но ни один сервер не работает на порту 8888.Что здесь может быть не так?Кстати, этот вопрос не является дубликатом этого вопроса, поскольку в последнем вопросе проблема была вызвана сборщиком мусора, который запускался сразу после метода start.

1 Ответ

0 голосов
/ 30 августа 2019

Вы можете попробовать включить ведение журнала перед вызовом main ().Если во время вызова server.start () что-то не так, он запишет журналы ошибок.

То есть, добавьте это перед main ().

logging.basicConfig()

Например, еслипорт уже прослушивается другими процессами.

E0830 19:35:33.731000000 55600 src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc:40] {"created":"@1567164933.731000000","description":"No address added out of total 1 resolved","file":"src/core/ext/transport/chttp2/server/chttp2_server.cc","file_line":394,"referenced_errors":[{"created":"@1567164933.731000000","description":"Failed to add port to server","file":"src/core/lib/iomgr/tcp_server_windows.cc","file_line":510,"referenced_errors":[{"created":"@1567164933.731000000","description":"OS Error","file":"src/core/lib/iomgr/tcp_server_windows.cc","file_line":201,"os_error":"Only one usage of each socket address (protocol/network address/port) is normally permitted.\r\n","syscall":"bind","wsa_error":10048}]}]}

...