Skip to main content

Simple RPC with Protobuf Services

Project description

hyper-rpc

Build Status

Simple RPC with Protobuf Services

Uses grpcio_tools and purerpc under the hood.

Install

$ pip install hyper-rpc

Example

TLDR; See the example directory

Define an RPC service in a greeter.proto.

syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  rpc SayHelloGoodbye (HelloRequest) returns (stream HelloReply) {}
  rpc SayHelloToMany (stream HelloRequest) returns (stream HelloReply) {}
  rpc SayHelloToManyAtOnce (stream HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Then generate the services and stubs with hyper-rpc.

$ pip install hyper-rpc
$ hrpc greeter.proto

This creates greeter_gprc.py (services) and greeter_pb2.py (stubs) files.

You can then write an async-ready server.

"""Greeter server."""

from greeter_grpc import GreeterServicer
from greeter_pb2 import HelloReply, HelloRequest
from purerpc import Server


class Greeter(GreeterServicer):
    async def SayHello(self, message):
        return HelloReply(message=f"Hello {message.name}")

    async def SayHelloToMany(self, input_messages):
        async for message in input_messages:
            yield HelloReply(message=f"Hello, {message.name}")


if __name__ == "__main__":
    server = Server(50055)
    server.add_service(Greeter().service)
    server.serve(backend="trio")

And a client.

"""Greeter client."""

import anyio
import purerpc
from greeter_grpc import GreeterStub
from greeter_pb2 import HelloReply, HelloRequest


async def gen():
    for i in range(5):
        yield HelloRequest(name=str(i))


async def main():
    async with purerpc.insecure_channel("localhost", 50055) as channel:
        stub = GreeterStub(channel)
        reply = await stub.SayHello(HelloRequest(name="World"))
        print(reply.message)

        async for reply in stub.SayHelloToMany(gen()):
            print(reply.message)


if __name__ == "__main__":
    anyio.run(main, backend="trio")

And run them in separate terminals to see the output.

$ python server.py # terminal 1
$ python client.py # terminal 2

Output:

Hello, World
Hello, 0
Hello, 1
Hello, 2
Hello, 3
Hello, 4

Go forth and Remote Procedure Call.

The person who invented the term RPC

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hyper-rpc-0.0.1a4.tar.gz (15.5 kB view details)

Uploaded Source

Built Distribution

hyper_rpc-0.0.1a4-py3-none-any.whl (15.3 kB view details)

Uploaded Python 3

File details

Details for the file hyper-rpc-0.0.1a4.tar.gz.

File metadata

  • Download URL: hyper-rpc-0.0.1a4.tar.gz
  • Upload date:
  • Size: 15.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.9 CPython/3.8.0 Linux/4.9.0-13-amd64

File hashes

Hashes for hyper-rpc-0.0.1a4.tar.gz
Algorithm Hash digest
SHA256 c5434d8711fd590ecd5b902171517661d8ca6302f16c9962f7d758841936ac97
MD5 2d39cf1c35c3152f1132d026533a3884
BLAKE2b-256 a5f256dd97c7c10dbdc7bce5939bbd59ceb4985f0b4a94a260a1a5fd229066a9

See more details on using hashes here.

File details

Details for the file hyper_rpc-0.0.1a4-py3-none-any.whl.

File metadata

  • Download URL: hyper_rpc-0.0.1a4-py3-none-any.whl
  • Upload date:
  • Size: 15.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.9 CPython/3.8.0 Linux/4.9.0-13-amd64

File hashes

Hashes for hyper_rpc-0.0.1a4-py3-none-any.whl
Algorithm Hash digest
SHA256 37dcb611dee7536e11c62560df85bda57a4f0998e0be013bf7ad08c26865fbcb
MD5 6b18eeac538a3c7737f7edf08dca6284
BLAKE2b-256 f9c783157fd2de0da54af75d267a482996d53358e2b893c0f0a3b91093b088e1

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page