python中grpc配合asyncio使用

python中grpc配置asyncio使用

  1. 安装grpclib
    pip3 install grpclib

  2. protoc编译.proto文件,生成源码文件
    python -m grpc_tools.protoc -I. --python_out=. --grpclib_python_out=. helloworld.proto
    grpclib github官网

  3. helloworld.proto文件代码

syntax = "proto3";

option go_package = ".;proto";

service Greeter {
    rpc SayHello(HelloRequest) returns (HelloReply);
}

message HelloRequest {
    string name = 1;
}

message HelloReply {
    string message = 1;
}
  1. server.py
import asyncio

# from grpclib.utils import graceful_exit
from grpclib.server import Server

# generated by protoc
from grpclib_test.helloworld_pb2 import HelloReply
from grpclib_test.helloworld_grpc import GreeterBase


class Greeter(GreeterBase):

    async def SayHello(self, stream):
        request = await stream.recv_message()
        message = f'Hello, {request.name}!'
        await stream.send_message(HelloReply(message=message))


async def main(*, host='127.0.0.1', port=50051):
    server = Server([Greeter()])
    # Note: graceful_exit isn't supported in Windows
    # with graceful_exit([server]):
    await server.start(host, port)
    print(f'Serving on {host}:{port}')
    await server.wait_closed()


if __name__ == '__main__':
    asyncio.run(main())

  1. client.py
import asyncio

from grpclib.client import Channel

# generated by protoc
from grpclib_test.helloworld_pb2 import HelloRequest, HelloReply
from grpclib_test.helloworld_grpc import GreeterStub


async def main():
    async with Channel('127.0.0.1', 50051) as channel:
        greeter = GreeterStub(channel)

        reply = await greeter.SayHello(HelloRequest(name="马亚南"))
        print(reply.message)


if __name__ == '__main__':
    asyncio.run(main())

总结:客户端可以使用asyncio发起连接,服务端使用了asyncio可以维护大量的连接。
疑问:这个会影响go和python之间的相互调用吗?
我们用go client请求一下试试:

package main

import (
	"context"
	"goRPC/grpc_test/proto"
	"google.golang.org/grpc"
)

func main() {
	conn, _ := grpc.Dial("127.0.0.1:50051", grpc.WithInsecure())
	defer conn.Close()
	client := proto.NewGreeterClient(conn)
	rsp, _ := client.SayHello(context.Background(), &proto.HelloRequest{Name: "马亚南"})
	print(rsp.Message)
}

请求一切正常。

posted @ 2022-01-19 21:06  专职  阅读(949)  评论(0编辑  收藏  举报