Python 에서 gRPC 를 사용 하 는 방법 예시
Protocol Buffers 의 크로스 플랫폼 RPC 시스템 을 사용 합 니 다.
설치 하 다.
pip 사용
pip install grpcio
pip install grpcio-tools googleapis-common-protos
gRPC 는 두 부분 으로 구성 되 어 있 으 며,grpcio 와 gRPC 도구 이 며,후 자 는 protocol buffer 를 컴 파일 하고 코드 를 생 성 하 는 플러그 인 입 니 다.쓰다
프로 토 콜 버퍼 작성
gRPC 를 사용 하려 면 먼저 프로 토 콜 버퍼 를 설계 해 야 합 니 다.새 파일
msg.proto
.
syntax = "proto3";
service MsgService {
rpc GetMsg (MsgRequest) returns (MsgResponse){}
}
message MsgRequest {
string name = 1;
}
message MsgResponse {
string msg = 1;
}
위의 이 메시지 서 비 스 를 예 로 들 면 먼저 문법 을 규정 하고 여 기 는proto3
의 문법 을 사용한다.이 어service
키워드 정의 서 비 스 를 사용 하고 gRPC 는 4 가지 RPC 유형의 서 비 스 를 제공 합 니 다.여기 서 정 의 된 것 은 첫 번 째 단일 요청 단일 응답 입 니 다.일반적인 함수 호출 과 유사 하고 다른 것 은stream
키워드 에 사용 되 었 습 니 다.괄호 안에 넣 으 면 이 숫자 는 스 트림 데이터 입 니 다.이것 은 나중에 다시 연구 하 겠 습 니 다.이번 에는 간단 한 RPC 를 설계 하 겠 습 니 다.그 다음 에 두 개
message
를 정 의 했 는데 하 나 는 요청 의 구조 이 고 하 나 는 응답 의 결과 이다.이 데이터 구 조 는 문자열 이 고 protocol buffer 는 int 32,int 64,double,float 등 으로 정의 할 수 있 습 니 다.여기에 부 여 된 초기 값 은 마음대로 작성 할 수 있 으 며,실제 사용 중 에는 새로운 값 이 부 여 됩 니 다.인터페이스 코드 생 성
이전에 보조 플러그 인 이 설치 되 어 있 었 기 때문에,이곳 을 사용 하면 바로 생 성 할 수 있 습 니 다.
python -m grpc_tools.protoc -I . --pythoout=. --grpc_python_out=. msg.proto
여기에 두 개의 파일 이 생 성 됩 니 다.msg_pb2.py
과msg_pb2_grpc.py
.이 두 파일 은 후속 서버 와 클 라 이언 트 를 위 한 것 입 니 다.전 자 는 일부 변 수 를 정의 했다.예 를 들 어_MSGREQUEST
에는 요청 함수 의 이름 이 포함 되 어 있 고 받 아들 일 수 있 는 변 수 는 실제 적 으로msg.proto
에서 정 의 된 것 이다.서버 생 성
우선 RPC 에 필요 한 가방 과 방금 생 성 된 두 개의 파일 을 가 져 와 야 합 니 다.
import grpc
import msg_pb2
import msg_pb2_grpc
RPC 는 장시간 가동 해 야 하기 때문에 성능 을 고려 해 동시 다발 라 이브 러 리 도 필요 하 다.
from concurrent import futures
import time
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
서버 에서 주로 서 비 스 를 실현 하고msg.proto
정의 에 따라 서비스 클래스MsgServicer
를 작성 해 야 합 니 다.이 클래스 는 이전에 정 의 된GetMsg
를 실현 해 야 합 니 다.
class MsgServicer(msg_pb2_grpc.MsgServiceServicer):
def GetMsg(self, request, context):
print("Received name: %s" % request.name)
return msg_pb2.MsgResponse(msg='Hello, %s!' % request.name)
GetMsg 가 받 은 요청 은request
에서msg.proto
에서 정 의 된name
이 바로request.name
이 고 이 어 GetMsg 에서 디자인msg.proto
에서 정 의 된MsgResponse
이다.이후 서 비 스 를 시작 하 는 부분 을 실현 하면 된다.
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
msg_pb2_grpc.add_MsgServiceServicer_to_server(MsgServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
병렬 라 이브 러 리 를 통 해 서버 를 다 중 프로 세 스에 서 실행 합 니 다.전체
msg_server.py
코드 는 다음 과 같다.
import grpc
import msg_pb2
import msg_pb2_grpc
from concurrent import futures
import time
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class MsgServicer(msg_pb2_grpc.MsgServiceServicer):
def GetMsg(self, request, context):
print("Received name: %s" % request.name)
return msg_pb2.MsgResponse(msg='Hello, %s!' % request.name)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
msg_pb2_grpc.add_MsgServiceServicer_to_server(MsgServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()
클 라 이언 트 만 들 기클 라 이언 트 가 상대 적 으로 간단 합 니 다.여기 저 는 간단 한 클 라 이언 트 를 썼 습 니 다.
import grpc
import msg_pb2
import msg_pb2_grpc
def run():
# NOTE(gRPC Python Team): .close() is possible on a channel and should be
# used in circumstances in which the with statement does not fit the needs
# of the code.
with grpc.insecure_channel('localhost:50051') as channel:
stub = msg_pb2_grpc.MsgServiceStub(channel)
response = stub.GetMsg(msg_pb2.MsgRequest(name='world'))
print("Client received: " + response.msg)
if __name__ == '__main__':
run()
grpc.insecure_channel('localhost:50051')
을 사용 하여 서버 를 연결 하고 이 어 이channel
에stub
를 만 들 고msg_pb2_grpc
에서MsgServiceStub
과 관련 된 정 보 를 찾 을 수 있 습 니 다.이stub
함 수 는 원 격GetMsg
함 수 를 호출 할 수 있 습 니 다.MsgRequest
중의name
즉msg.proto
에서 정 의 된 데이터.응답 에서msg.proto
에서 정 의 된msg
을 얻 을 수 있다.운행 하 다.
먼저 실행
python msg_server.py
서버 를 시작 하고 이 어 실행python msg_client.py
기 회 를 통 해 클 라 이언 트 가 서버 에서 보 내 온 메 시 지 를 볼 수 있 습 니 다.이상 은 간단 한 RPC 사용 이 었 습 니 다.총결산
여 기 는 gRPC 를 간단하게 사 용 했 을 뿐 다른 세 가지 모델 에 대해 서 는 모색 하고 있 습 니 다.gRPC 보다 쉬 운 Restful 이 더 마음 에 듭 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.