Python 에서 gRPC 를 사용 하 는 방법 예시

5709 단어 PythongRPC
본 고 는 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.pymsg_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')을 사용 하여 서버 를 연결 하고 이 어 이channelstub를 만 들 고msg_pb2_grpc에서MsgServiceStub과 관련 된 정 보 를 찾 을 수 있 습 니 다.이stub함 수 는 원 격GetMsg함 수 를 호출 할 수 있 습 니 다.MsgRequest중의namemsg.proto에서 정 의 된 데이터.응답 에서msg.proto에서 정 의 된msg을 얻 을 수 있다.
운행 하 다.
먼저 실행python msg_server.py서버 를 시작 하고 이 어 실행python msg_client.py기 회 를 통 해 클 라 이언 트 가 서버 에서 보 내 온 메 시 지 를 볼 수 있 습 니 다.이상 은 간단 한 RPC 사용 이 었 습 니 다.
총결산
여 기 는 gRPC 를 간단하게 사 용 했 을 뿐 다른 세 가지 모델 에 대해 서 는 모색 하고 있 습 니 다.gRPC 보다 쉬 운 Restful 이 더 마음 에 듭 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기