[Python-es] Dichoso GRPC en Python

Chema Cortes pych3m4 en gmail.com
Lun Mar 21 07:04:16 EDT 2022


Hola a todos:

Sin conocer mucho de GPRC, parece que no estás usando precisamente la nueva
AsyncIO API del GRPC para que te funcione asyncio.

Revisa la documentación en
https://grpc.github.io/grpc/python/grpc_asyncio.html

Saludos.


El sáb, 19 mar 2022 a las 16:22, Miguel de Dios Matias (<
tres.14159 en gmail.com>) escribió:

> Buenas.
>
> Me estoy haciendo unos POC en python sobre GRPC porque un compa del
> curro lo quiere meter.
>
> Y ya casi tengo (después de mucho sufrimiento...me da que no tiene
> muchs comunidad y esta medio abandonado GRPC salvo en Golang) todos
> los posibles formas de comunicación.
>
> Pero me queda la que el request sea un stream, bueno a medias, porque
> sincrona (que se quede clavado el client.py enviando mensajes si) pero
> asyncrona, naranjas de la china.
>
> Mi último intento fallido es:
>
> test.proto
> ---------------------------------------------------------
> syntax = "proto3";
>
> message Saludo {
>   string nombre = 1;
>   int32  segundo = 2;
> }
> message Respuesta {
>   string frase = 1;
>   int32 segundo = 2;
> }
> service Saluda {
>   // Sends a greeting
>   rpc buenosdias (stream Saludo) returns (stream Respuesta) {}
> }
> -----------------------------------------------------
>
> client.py
> -------------------------------------------------------
> import grpc
> from concurrent import futures
>
> # Generate pb2 and bp2_grpc generated python files
> # python3 -m grpc_tools.protoc --proto_path=. --python_out=.
> --grpc_python_out=. ./*.proto
>
> import test_service_pb2_grpc
> import test_pb2
>
> from datetime import datetime
> from time import sleep
>
> import asyncio
> from uuid import uuid4
>
> class MyIterator:
>     def __init__(self, start=0):
>         self.num = start
>
>     def __iter__(self):
>         return self
>
>     def __next__(self):
>         sleep(2)
>         nombre = uuid4()
>         print(nombre)
>         return test_pb2.Saludo(nombre=f'{nombre}',
> segundo=datetime.now().second)
>
>
> class AsyncIterator:
>     def __aiter__(self):
>         return self
>
>     async def __anext__(self):
>         await asyncio.sleep(2)
>         nombre = uuid4()
>         print(nombre)
>         return test_pb2.Saludo(nombre=f'{nombre}',
> segundo=datetime.now().second)
>
>
> if __name__ == '__main__':
>     print("TEST CLIENT GRPC")
>
>     server_uri = 'localhost:50053'
>     print(f"CONNECT TO: {server_uri}")
>     with grpc.insecure_channel(server_uri) as channel:
>         stub = test_service_pb2_grpc.SaludaStub(channel)
>         # ~ saludo = test_pb2.Saludo(nombre=f'{uuid4()}',
> segundo=datetime.now().second)
>         # ~ stream_connection = stub.buenosdias(iter((saludo,saludo)))
>         stream_connection = stub.buenosdias(MyIterator())
>         for response in stream_connection:
>             response_dict = {k.name: getattr(response, k.name) for k
> in response.DESCRIPTOR.fields}
>             print(f"CLIENTE RECEIVED: {response_dict}")
>
> --------------------------------------------------------------------------------------
>
> Con un iterador "sincrono" funciona pero se queda o llamando con un
> iterador de 1 elemento puest también y solo se clava 1 vez pero si
> meto:
> stream_connection = stub.buenosdias(AsyncIterator())
>
> Falla.
>
> Saludos.
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
>


-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
https://blog.ch3m4.org
Buscador Python Hispano: http://busca.ch3m4.org
<https://blog.ch3m4.org/pages/busqueda-python-es/>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://mail.python.org/pipermail/python-es/attachments/20220321/affb7635/attachment.html>


Más información sobre la lista de distribución Python-es