Как я могу опубликовать сообщение в канале Redis асинхронно с python?

#python #django-rest-framework #redis #python-asyncio

#python #django-rest-framework #redis #python-asyncio

Вопрос:

В моем существующем API djangorest я хочу опубликовать сообщение в канале Redis со стороны кода python. Я хочу сделать это асинхронно, т. Е. Хочу вызвать асинхронную функцию, которая отправит сообщение на канал, и в то же время мой API должен отвечать пользователю, а не блокировать это сообщение redis.

Давайте посмотрим пример.

Приведенный ниже код работает хорошо

 #Python function (api function)
def create(self, request, *args, **kwargs):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer
    #some business logic
    connection = redis.Redis(host=config("REDIS_SERVER_URL"), port=config("REDIS_SERVER_PORT"), db=config("REDIS_SERVER_DB"))
    connection.publish('my_channel', 'my pubsub message')
    
    return Response(      
        data={
            'status': True,
            'message': "Order Successfully Created",
            'data': response
        },
        status=status.HTTP_201_CREATED
    )


  

Но я не хочу ждать подключения redis и публикации сообщения, а хочу сделать это асинхронно, как показано ниже

 
async def publish_message(channel, message):
    connection = await redis.Redis(host=config("REDIS_SERVER_URL"), port=config("REDIS_SERVER_PORT"), db=config("REDIS_SERVER_DB"))
    await connection.publish('channel', 'my pubsub message')
    return "Nice"



#Python function (api function)
def create(self, request, *args, **kwargs):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer
    #some business logic
    publish_message('my_channel', 'my pubsub message')
    
    return Response(      
        data={
            'status': True,
            'message': "Order Successfully Created",
            'data': response
        },
        status=status.HTTP_201_CREATED
    )


  

Ответ №1:

Вы не можете ожидать подключения и redis, потому что они не являются корутинами. Это будет выглядеть так:

  async def publish_message(channel, message):
        connection = redis.Redis(host=config("REDIS_SERVER_URL"), port=config("REDIS_SERVER_PORT"), db=config("REDIS_SERVER_DB"))
        connection.publish('channel', 'my pubsub message')
        return "Nice"

def it_works():
    await publish_message('gg', 'wp')