def purerpc_codegen_greeter_port(greeter_pb2, greeter_grpc): class Servicer(greeter_grpc.GreeterServicer): async def SayHello(self, message): return greeter_pb2.HelloReply(message="Hello, " + message.name) @async_generator async def SayHelloGoodbye(self, message): await yield_( greeter_pb2.HelloReply(message="Hello, " + message.name)) await yield_( greeter_pb2.HelloReply(message="Goodbye, " + message.name)) async def SayHelloToManyAtOnce(self, messages): names = [] async for message in messages: names.append(message.name) return greeter_pb2.HelloReply(message="Hello, " + ", ".join(names)) @async_generator async def SayHelloToMany(self, messages): async for message in messages: await yield_( greeter_pb2.HelloReply(message="Hello, " + message.name)) with run_purerpc_service_in_process(Servicer().service) as port: yield port
def purerpc_echo_port(echo_pb2, echo_grpc): class Servicer(echo_grpc.EchoServicer): async def Echo(self, message): return echo_pb2.EchoReply(data=message.data) @async_generator async def EchoTwoTimes(self, message): await yield_(echo_pb2.EchoReply(data=message.data)) await yield_(echo_pb2.EchoReply(data=message.data)) @async_generator async def EchoEachTime(self, messages): async for message in messages: await yield_(echo_pb2.EchoReply(data=message.data)) async def EchoLast(self, messages): data = [] async for message in messages: data.append(message.data) return echo_pb2.EchoReply(data="".join(data)) @async_generator async def EchoLastV2(self, messages): data = [] async for message in messages: data.append(message.data) await yield_(echo_pb2.EchoReply(data="".join(data))) with run_purerpc_service_in_process(Servicer().service) as port: yield port
def purerpc_port(greeter_pb2, greeter_grpc): class Servicer(greeter_grpc.GreeterServicer): async def SayHello(self, message, request): return greeter_pb2.HelloReply(message=base64.b64encode(pickle.dumps( request.custom_metadata))) with run_purerpc_service_in_process(Servicer().service) as port: yield port
def purerpc_server_wrong_method_name_port(greeter_pb2): service = purerpc.Service("Greeter") @service.rpc("SomeOtherMethod") async def say_hello( message: greeter_pb2.HelloRequest) -> greeter_pb2.HelloReply: return greeter_pb2.HelloReply(message="Hello, " + message.name) with run_purerpc_service_in_process(service) as port: yield port
def purerpc_server_wrong_service_name_port(greeter_pb2): service = purerpc.Service("some_package.SomeWrongServiceName") @service.rpc("SayHello") async def say_hello( message: greeter_pb2.HelloRequest) -> greeter_pb2.HelloReply: return greeter_pb2.HelloReply(message="Hello, " + message.name) with run_purerpc_service_in_process(service) as port: yield port
def purerpc_port(greeter_pb2): service = purerpc.Service("Greeter") @service.rpc("SayHello") async def say_hello( message: greeter_pb2.HelloRequest) -> greeter_pb2.HelloReply: status_code_tuple = pickle.loads(base64.b64decode(message.name)) raise status_code_tuple[0](status_code_tuple[2]) with run_purerpc_service_in_process(service) as port: yield port
def purerpc_port(greeter_pb2, greeter_grpc): class Servicer(greeter_grpc.GreeterServicer): async def SayHello(self, message): raise ValueError("oops my bad") @async_generator async def SayHelloToMany(self, messages): idx = 1 async for _ in messages: await yield_(greeter_pb2.HelloReply(message=str(idx))) if idx == 7: raise ValueError("Lucky 7") idx += 1 with run_purerpc_service_in_process(Servicer().service) as port: yield port
def purerpc_simple_greeter_port(greeter_pb2): service = purerpc.Service("Greeter") @service.rpc("SayHello") async def say_hello( message: greeter_pb2.HelloRequest) -> greeter_pb2.HelloReply: return greeter_pb2.HelloReply(message="Hello, " + message.name) @service.rpc("SayHelloGoodbye") @async_generator async def say_hello_goodbye( message: greeter_pb2.HelloRequest ) -> purerpc.Stream[greeter_pb2.HelloReply]: await yield_(greeter_pb2.HelloReply(message="Hello, " + message.name)) await yield_(greeter_pb2.HelloReply(message="Goodbye, " + message.name) ) @service.rpc("SayHelloToManyAtOnce") async def say_hello_to_many_at_once( messages: purerpc.Stream[greeter_pb2.HelloRequest] ) -> greeter_pb2.HelloReply: names = [] async for message in messages: names.append(message.name) return greeter_pb2.HelloReply(message="Hello, " + ', '.join(names)) @service.rpc("SayHelloToMany") @async_generator async def say_hello_to_many( messages: purerpc.Stream[greeter_pb2.HelloRequest] ) -> purerpc.Stream[greeter_pb2.HelloReply]: async for message in messages: await yield_( greeter_pb2.HelloReply(message="Hello, " + message.name)) with run_purerpc_service_in_process(service) as port: yield port
def dummy_server_port(): with run_purerpc_service_in_process(purerpc.Service("Greeter")) as port: yield port
if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--message_size", type=int, default=1000) parser.add_argument("--num_workers", type=int, default=3) parser.add_argument("--num_concurrent_streams", type=int, default=100) parser.add_argument("--num_requests_per_stream", type=int, default=50) parser.add_argument("--num_rounds", type=int, default=10) parser.add_argument("--load_type", choices=["unary", "stream"], required=True) args = parser.parse_args() queues = [multiprocessing.Queue() for _ in range(args.num_workers)] with run_purerpc_service_in_process(Greeter().service) as port: def target_fn(worker_id): queue = queues[worker_id] anyio.run(worker, port, queue, args.num_concurrent_streams, args.num_requests_per_stream, args.num_rounds, args.message_size, args.load_type) processes = [] for worker_id in range(args.num_workers): process = multiprocessing.Process(target=target_fn, args=(worker_id, )) process.start() processes.append(process) for round_id in range(args.num_rounds):