[英]Failure to implement a Client Streaming to Server Python code
我刚开始使用 gRPC,这让我有些困惑。 我正在尝试制作一个流到服务器的客户端和一个流到客户端的服务器。 我成功地将服务器流式传输到客户端,但未能将客户端流式传输到服务器。
这是我正在使用的 .proto 文件:
syntax = "proto3";
package streaming;
service Streaming{
rpc ServerStreaming (Message) returns (stream Message) {}
rpc ClientStreaming (stream Message) returns (Message) {}
}
message Message{
string message = 1;
}
message MessageResponse{
string message = 1;
bool received = 2;
}
这是我的服务器代码:
from concurrent import futures
import grpc
import streaming_pb2_grpc as streaming_pb2_grpc
import streaming_pb2 as streaming_pb2
def make_message(message):
return streaming_pb2.Message(
message=message
)
class StreamingService(streaming_pb2_grpc.StreamingServicer):
def ServerStreaming(self, request_iterator, context):
message_full = ''
for message in request_iterator:
message_full += message
result = f'Hello I am up and running received "{message_full}" message from you'
result = {'message': result, 'received': True}
return streaming_pb2.MessageResponse(**result)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
streaming_pb2_grpc.add_StreamingServicer_to_server(StreamingService(), server)
server.add_insecure_port('[::]:8091')
server.start()
server.wait_for_termination()
if __name__ == '__main__':
serve()
这是客户端:
import grpc
import streaming_pb2_grpc as streaming_pb2_grpc
import streaming_pb2 as streaming_pb2
def make_message(message):
return streaming_pb2.Message(
message=message
)
def generate_messages():
messages = [
make_message("First message"),
make_message("Second message"),
make_message("Third message"),
make_message("Fourth message"),
make_message("Fifth message"),
]
for msg in messages:
print("Hello Server Sending you the %s" % msg.message)
yield msg
def send_message(stub):
responses = stub.ServerStreaming(generate_messages())
for response in responses:
print("Hello from the server received your %s" % response.message)
def run():
with grpc.insecure_channel('localhost:8091') as channel:
stub = streaming_pb2_grpc.StreamingStub(channel)
send_message(stub)
if __name__ == '__main__':
run()
这是我在运行客户端时遇到的错误:
/Users/<>/bin/python3 /Users/<>/client_streaming_client.py
Traceback (most recent call last):
File "/Users/<>/client_streaming_client.py", line 40, in <module>
run()
File "/Users/<>/client_streaming_client.py", line 36, in run
send_message(stub)
File "/Users/<>/client_streaming_client.py", line 28, in send_message
responses = stub.ServerStreaming(generate_messages())
File "/Users/<>/lib/python3.7/site-packages/grpc/_channel.py", line 1057, in __call__
raise rendezvous # pylint: disable-msg=raising-bad-type
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
status = StatusCode.INTERNAL
details = "Exception serializing request!"
debug_error_string = "None"
>
Process finished with exit code 1
知道我在这里做错了什么吗? 我无知。。
从您的帖子中并不完全清楚您期望发生什么。 您已经定义了两个 RPC ServerStreaming
(一个响应流 RPC )和ClientStreaming
(一个请求流 RPC )。 您的原型都没有使用MessageResponse
类型(但您的服务器尝试返回它)。
根据您编写的客户端和服务器代码,我认为您期待双向流式传输 RPC ,其定义如下:
流媒体.proto
syntax = "proto3";
package streaming;
service Streaming {
rpc ClientStreaming(stream Message) returns (stream MessageResponse) {}
}
message Message{
string message = 1;
}
message MessageResponse{
string message = 1;
bool received = 2;
}
然后你可以迭代请求并产生来自服务器的响应:
from concurrent import futures
import grpc
import streaming_pb2_grpc as streaming_pb2_grpc
import streaming_pb2 as streaming_pb2
class StreamingService(streaming_pb2_grpc.StreamingServicer):
def ClientStreaming(self, request_iterator, context):
s = ""
for message in request_iterator:
print(f"Received: {message.message!r}")
s = ", ".join([s, message.message]) if s else message.message
yield streaming_pb2.MessageResponse(message=s, received=True)
if __name__ == "__main__":
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
streaming_pb2_grpc.add_StreamingServicer_to_server(StreamingService(), server)
server.add_insecure_port("[::]:8091")
server.start()
server.wait_for_termination()
您可以使用可迭代和迭代响应与客户端发送消息:
import grpc
import streaming_pb2_grpc as streaming_pb2_grpc
import streaming_pb2 as streaming_pb2
def generate_messages():
messages = [
"First message",
"Second message",
"Third message",
"Fourth message",
"Fifth message",
]
for msg in messages:
msg = streaming_pb2.Message(message=msg)
print(f"Sending {msg.message!r}")
yield msg
def send_message(stub):
responses = stub.ClientStreaming(generate_messages())
for response in responses:
print(f"Received {response.message!r}")
if __name__ == "__main__":
with grpc.insecure_channel("localhost:8091") as channel:
stub = streaming_pb2_grpc.StreamingStub(channel)
send_message(stub)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.