异步纯python grpc客户机和服务器实现,支持asyncio、uvloop、curio和trio

purerpc的Python项目详细描述


purerpc

Build StatusPyPI versionDownloads

异步纯python grpc客户端和服务器实现支持 asynciouvloopcuriotrio(通过anyio兼容层实现)。

要求

  • cpython=3.5
  • Pypy=3.5

安装

最新的PYPI版本:

pip install purerpc

最新开发版本:

pip install git+https://github.com/standy66/purerpc.git

默认情况下purerpc使用异步事件循环,如果您想使用uvloop、curio或trio,请手动安装它们。

protoc插件

purerpc将protoc-gen-purerpcprotoc插件添加到PATH环境变量中 因此,您可以使用它生成服务定义和存根:

protoc --purerpc_out=. --python_out=. -I. greeter.proto

或者,如果您安装了grpcio_toolspython包:

python -m grpc_tools.protoc --purerpc_out=. --python_out=. -I. greeter.proto

用法

注意:greeter_grpc模块是由purerpc的protoc-gen-purerpc插件生成的。

下面是Python3.6及更高版本的示例,其中引入了异步生成器作为语言概念。 对于不支持本机异步生成器的python 3.5,可以为此使用async_generator库。 只需用@async_generatordecorator标记产生协同程序,并使用await yield_(value)await yield_from_(async_iterable)而不是yield

服务器

fromgreeter_pb2importHelloRequest,HelloReplyfromgreeter_grpcimportGreeterServicerfrompurerpcimportServerclassGreeter(GreeterServicer):asyncdefSayHello(self,message):returnHelloReply(message="Hello, "+message.name)asyncdefSayHelloToMany(self,input_messages):asyncformessageininput_messages:yieldHelloReply(message=f"Hello, {message.name}")server=Server(50055)server.add_service(Greeter().service)server.serve(backend="asyncio")# backend can also be one of: "uvloop", "curio", "trio"

客户

importanyioimportpurerpcfromgreeter_pb2importHelloRequest,HelloReplyfromgreeter_grpcimportGreeterStubasyncdefgen():foriinrange(5):yieldHelloRequest(name=str(i))asyncdefmain():asyncwithpurerpc.insecure_channel("localhost",50055)aschannel:stub=GreeterStub(channel)reply=awaitstub.SayHello(HelloRequest(name="World"))print(reply.message)asyncforreplyinstub.SayHelloToMany(gen()):print(reply.message)if__name__=="__main__":anyio.run(main,backend="asyncio")# backend can also be one of: "uvloop", "curio", "trio"

您可以混合使用服务器和客户端代码,例如,让一个服务器使用purerpc从另一个grpc服务器请求某些内容,等等。

misc/文件夹中的更多示例

Release 0.5.2(2019-07-23)

功能

  • 异步的附加异常屏蔽(3cbd35c

Release 0.5.1(2019-07-23)

错误修复

  • python 3.5上的异步生成器(1c19229

Release 0.5.0(2019-07-23)

功能

  • 现在可以通过contextmngr或setup/teardown来添加服务(208dd95

Release 0.4.1(2019-07-22)

功能

  • 删除任何IO(6de2c9a)中未经记录使用原始套接字的情况

Release 0.4.0(2019-07-22)

错误修复

功能

  • 将状态属性添加到grpcstream(0019d8c
  • 应答ping帧(c829901
  • 将最大并发流从1000更改为65536(d2d461f
  • 分离h2和grpclib逻辑(1f4e6b0
  • 支持百分比编码的GRPC消息头(c6636f4
  • 将默认最大消息长度更改为32 MB

Release 0.3.2(2019-02-15)

错误修复

  • 修复依赖项,删除一些anyio monkey补丁(ac6c5c2

Release 0.3.1(2019-02-15)

错误修复

  • 修复purerpc.test实用程序中的酸洗错误。wrappedresult(9f0a63d

Release 0.3.0(2019-02-14)

功能

  • 在purerpc.test实用程序中公开新函数(07b10e1
  • 迁移到pytest(95c0a8b

破坏性变化

  • purerpc.test_utils.purerpctestcase被删除

Release 0.2.0(2019-02-10)

功能

  • 将后端选项添加到server.serve(5f47f8e
  • 添加对python 3.5的支持(a681192
  • 改进了测试实用程序中的异常处理(b1df796
  • 迁移到anyio(746b1c2

破坏性变化

  • 服务器和测试现在默认使用异步事件循环, 可以使用purerpc_backend环境变量更改此行为
  • purerpc.channel被移除,迁移到 purerpc.unsecure_channel异步上下文管理器(现在支持正确的 关机)

版本0.1.6

  • 允许在请求参数中将请求头传递给方法处理程序
  • 允许将自定义元数据传递给方法存根调用(在元数据中,可选关键字参数)

释放0.1.5

  • 强制执行,以便保持小超时
  • 在purerpc api中公开purerpctestcase,用于单元测试purerpc服务

版本0.1.4

  • 加速protoc插件

0.1.3版[仅限PYPI]

  • 修复pypi上的长描述

版本0.1.2

  • 在Python3.7上修复单元测试

版本0.1.0

  • 执行立即模式

释放0.0.1

  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Spring3MVC:将JavaMIMessage电子邮件显示为html   java从嵌套列表中获取最大值,并使用流将其转换为一个列表   内存泄漏java StackOverflower在无限循环中抛出错误   java线性回归,标准误差问题   java如何使用HQL/Hibernate验证我的所有表都是空的?   java扫描封闭空间   Java和Selenium:在id和选择器写得不好时获取列表内容   java数组项的索引不断增加这很简单,我不知道怎么做   java重用来自不同类的变量?   java为什么我的递归函数在循环中失败?   如何在Java单例枚举构造函数中调用方法?   HDFS上的java文件,用于初始化Flink作业中的对象   io Java:如何处理试图修改同一文件的两个进程   java从MySql迁移:MariaDB服务器意外关闭客户端连接   这是我写的代码,但是提交不起作用。其显示RE(NZEC)错误   java垃圾收集的“隔离岛”   java调用另一个类中的AppCompatActivity类   java spring@Value注释、继承和公共字段,但值不同   java重载未按预期运行