适用于asyncio的纯Python gRPC实现
项目描述
本项目基于 hyper-h2,并且需要Python >= 3.7。
示例
请参阅项目存储库中的 examples 目录中的所有可用示例。
客户端
import asyncio
from grpclib.client import Channel
# generated by protoc
from .helloworld_pb2 import HelloRequest, HelloReply
from .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='Dr. Strange'))
print(reply.message)
if __name__ == '__main__':
asyncio.run(main())
服务器
import asyncio
from grpclib.utils import graceful_exit
from grpclib.server import Server
# generated by protoc
from .helloworld_pb2 import HelloReply
from .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())
安装
$ pip3 install "grpclib[protobuf]"
错误修复和新功能通常通过发布候选版发布
$ pip3 install --upgrade --pre "grpclib[protobuf]"
对于代码生成,您还需要一个 protoc 编译器,该编译器可以通过 protobuf 系统包安装
$ brew install protobuf # example for macOS users
$ protoc --version
libprotoc ...
或者 您可以使用来自 grpcio-tools Python包的 protoc 编译器
$ pip3 install grpcio-tools
$ python3 -m grpc_tools.protoc --version
libprotoc ...
注意: grpcio 和 grpcio-tools 包在运行时不是必需的,grpcio-tools 包仅在代码生成期间使用。
protoc 插件
为了使用此库,您必须使用提供的插件生成特殊的存根文件,可以使用以下方式使用这些文件
$ python3 -m grpc_tools.protoc -I. --python_out=. --grpclib_python_out=. helloworld/helloworld.proto
^----- note -----^
此命令将生成 helloworld_pb2.py 和 helloworld_grpc.py 文件。
实现了 --grpclib_python_out 选项的插件应作为 protoc 编译器的 protoc-gen-grpclib_python 可执行文件可用,该文件应在安装 grpclib 库时通过 pip 安装到您的 $PATH 中。
在 v0.3.2 版本中更新:将 --python_grpc_out 选项重命名为 --grpclib_python_out。
贡献
在提交拉取请求之前请提交一个问题
在您处理拉取请求时,不要合并/折叠/重新基您的开发分支,如果这真的有必要,请使用重新基
您可以使用 Tox 来测试和检查您的更改,但依靠 CI 来处理这个问题是可以的