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)
}

請求一切正常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM