异步调用,而不是在Django中使用pubnub时等待

时间:2019-01-20 19:42:45

标签: python django multithreading asynchronous pubnub

这是PubNub中的一个模块,我正在使用该模块将消息从API发布到主题。通过设计,我使PubNub对象保持单例。

class Pubnub:
    instance = None

    @classmethod
    def get(cls):
        if cls.instance is None:
            cls.instance = cls()
        return cls.instance

    def __init__(self):
        with open('config/config.yaml', 'r') as stream:
            try:
                conf = yaml.load(stream)
                pnconfig = PNConfiguration()
                pnconfig.subscribe_key = conf['pubnub']['publish_key']
                pnconfig.publish_key = conf['pubnub']['subscribe_key']
                pnconfig.ssl = False
                self.pubnub = PubNub(pnconfig)
            except yaml.YAMLError as e:
                logger.error(str(e))

    def publish(self, channel):
        try:
            envelope = self.pubnub.publish().channel(channel).message({
                'message': True
            }).sync()
            print("publish timetoken: %d" % envelope.result.timetoken)
        except PubNubException as e:
            logger.error(str(e))

这就是我的称呼方式

class SendCommunityTextMessage(views.APIView):
    def post(self, request, **kwargs):
        try:
            client_id = request.GET['client_id']
            client_secret = request.GET['client_secret']
            if Authenticator.authenticate_client(client_id, client_secret):
                try:
                   //do something
                    try:
                        //do something more

                        pubbub = Pubnub.get()
                        pubbub.publish(receiver.hex_code)
                        return Response({"Success": CommunityTextMessageSerializer(message).data},
                                        status=status.HTTP_200_OK)
                    except KeyError as e:
                        return Response({"Failure": str(e)}, status=status.HTTP_400_BAD_REQUEST)
                except (User.DoesNotExist, CommunityRoom.DoesNotExist) as e:
                    return Response({"Failure": str(e)}, status=status.HTTP_404_NOT_FOUND)

            else:
                return Response({"Failure": "Invalid client"}, status=status.HTTP_403_FORBIDDEN)

        except KeyError as _:
            return Response({"Failure": "Probably a typo, read the docs to use this API."},
                            status=status.HTTP_400_BAD_REQUEST)

问题在于这会使API速度降低几分钟。我怎么称呼这两行,

pubbub = Pubnub.get()
pubbub.publish(receiver.hex_code)

异步并退出视图而无需等待调用结束。

感谢您的期待。

0 个答案:

没有答案