Python gRPC 服务器未启动
Python gRPC Server Not Starting
我已经使用 proto3 创建了一个 gRPC 服务器,并且 python 对长 运行 守护进程进行基本的健康检查。但是,当我启动我的应用程序时,它实际上并没有启动 gRPC 服务器。我想知道是否有人可以帮助确定为什么它不启动并为 gRPC API
提供服务
原型定义: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)>
在我看来,您的服务器仅分配给了 serve_health_api
函数中的本地字段,因此当该函数 returns (在启动服务器后立即)服务器已被垃圾收集并关闭。
我已经使用 proto3 创建了一个 gRPC 服务器,并且 python 对长 运行 守护进程进行基本的健康检查。但是,当我启动我的应用程序时,它实际上并没有启动 gRPC 服务器。我想知道是否有人可以帮助确定为什么它不启动并为 gRPC API
提供服务原型定义: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)>
在我看来,您的服务器仅分配给了 serve_health_api
函数中的本地字段,因此当该函数 returns (在启动服务器后立即)服务器已被垃圾收集并关闭。