반응형
파이썬에서 gRPC "하나의" 프로토 구조를 어떻게 사용할 수 있나요?
나는 클라이언트용 파이썬을 사용하여 파일 스토리지 클라이언트/서버를 구축하고 있으며, gRPC와 함께 서버로 이동한다. 나는 이미 성공적으로 클라이언트 인고를 구축했고 그것은 작동한다! 나는 지금 파이썬에서도 같은 일을 하려고 노력하고 있다. 오늘 하루종일 작업했는데 0개의 진척이 -_-. 내 서버로 보내는 요청은 gRPC 라이브러리에서 뱉어지는 오류 메시지로 판단할 때 어떤 식으로든 잘못된 형식일 수 있습니다.
File "/Users/xxxxx/Desktop/clients/uploadClient.py", line 60, in upload_file
for res in stream:
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/grpc/_channel.py", line 367, in __next__
return self._next()
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/grpc/_channel.py", line 361, in _next
raise self
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
status = StatusCode.INTERNAL
details = "Exception serializing request!"
debug_error_string = "None"
>
별로 도움이 되지 않는다. 나는 어떤 도움이 되는 문서도 찾지 못했고 읽고 검색하는 시간도 아직 성과를 거두지 못했다. 지금까지 제가 제외할 수 있는 것은 Go 클라이언트가 잘 작동하고 있기 때문에 서버와 관련된 문제라는 것입니다.
여기 내 프로토(참고: 나는 이것을 약간 증류하고 몇 가지 이름을 바꾸었다):
syntax = "proto3";
import "google/protobuf/timestamp.proto";
package upload;
message Chunk {
message Index {
uint64 as_uint64 = 1;
}
Index index = 1;
bytes sha512 = 2;
bytes data = 3;
}
message Descriptor {
string author = 1; // author
string label = 2; // label
Format format = 3; //format
}
enum Format {
FORMAT_UNKNOWN = 0;
FORMAT_CSV = 1;
FORMAT_XML = 2;
FORMAT_JSON = 3;
FORMAT_PDF = 4;
}
message UploadFile {
message ToClient {
oneof details {
Finished finished = 1;
}
}
message ToService {
oneof details {
Descriptor descriptor = 1;
Chunk chunk = 2;
}
}
}
.
service FileService {
rpc Upload(stream UploadFile.ToService) returns (stream UploadFile.ToClient);
}
코드는 다음과 같습니다(참고: 나는 이것을 약간 증류하고 몇 가지 이름을 바꾸었다):
import s_pb2 as s
import s_pb2_grpc as s_grpc
token = 'xxxx'
url = 'xxxx:433'
requestMetadata = [('authorization', 'Bearer ' + token)]
def create_stub():
creds = grpc.ssl_channel_credentials()
channel = grpc.secure_channel(url, creds)
return s_grpc.UploadManagerStub(channel)
def upload_file(src, label, fileFormat):
stub = create_stub()
stream = stub.Upload(
request_iterator=__upload_file_iterator(src, label, fileFormat),
metadata=requestMetadata
)
for res in stream:
print(res)
return stream
def __upload_file_iterator(src, name, fileFormat, chunk_size = 1024):
def descriptor():
to_service = s.UploadFile.ToService
to_service.descriptor = s.Descriptor(
label=label,
format=fileFormat
)
return to_service
yield descriptor()
네, 제 반복기가 한 가지만 반환하는 것으로 알고 있습니다. 문제를 분리하기 위해 코드를 제거했습니다.
gRPC는 나의 가장 강한 기술이 아니며 나는 내 완두콩 두뇌가 명백한 무언가를 놓치고 있다고 믿고 싶다.
모든 도움에 감사드립니다!
이봐요, 이 일은 좀 더 진전이 있었나요? 당신은 깃허브 링크를 가지고 있나요? grpc 리소스를 찾는 것이 어렵기 때문에 이것은 나에게 정말 도움이 될 것이다.
생성자에서 "하나" 세부 정보를 래핑하여 문제를 해결했습니다.
def chunk(data, index):
return s.UploadFile.ToService(
chunk=s.Chunk(
index=s.Chunk.Index(as_uint64=index),
data=data,
sha512=hashlib.sha512(data).digest()
)
)
def descriptor(name, fileFormat):
return s.UploadFile.ToService(
descriptor=s.Descriptor(
name=name,
format=fileFormat
)
)
반응형
'개발하자' 카테고리의 다른 글
Azure CNI 네트워크 정책을 사용하여 Kubernetes 포드에서 특정 FQDN/DNS로의 송신만 허용 (0) | 2022.12.10 |
---|---|
react.js로 svelt store를 사용하는 방법 (0) | 2022.12.09 |
순방향 플러그인 사용 빈도: 로그에 Kubernetes 메타데이터를 추가하는 방법 (0) | 2022.12.08 |
파이썬 시프트 + 주피터가 있는 VScode에서 작동하지 않음을 입력합니다. (0) | 2022.12.08 |
VSCode Jupyter가 잘못된 버전의 python을 로드합니다. (0) | 2022.12.07 |