如何使用python在Redis通道中异步发布消息?

问题描述

在我现有的djangorest api中,我想从Python代码的一侧在Redis通道中发布一条消息。我想异步执行该操作,即要调用一个异步函数,该函数会将消息发送到通道,同时我的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"),db=config("REdis_SERVER_DB"))
    await connection.publish('channel','my pubsub message')
    return "Nice"



#Python function (api function)
def create(self,**kwargs):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer
    #some business logic
    publish_message('my_channel',status=status.HTTP_201_CREATED
    )


解决方法

您不能等待连接和Redis,因为它们不是Corutines。它看起来像:

 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')