Pypans和发送之间需要睡眠

2024-09-30 06:28:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用PyAPNs向iOS设备发送通知。我经常一次发送多组通知。如果任何令牌由于任何原因损坏,进程将停止。因此,我使用了增强的设置和以下方法:

apns.gateway_server.register_response_listener

我用这个来跟踪哪个令牌出了问题,然后从那里取下剩下的。问题是,在发送时,捕获这些错误的唯一方法是在令牌发送之间使用睡眠计时器。例如:

^{pr2}$

如果我不使用睡眠计时器,则不会捕捉到错误,因此当出现错误标记时,整个APN列表都不会发送到。然而,这个睡眠计时器有点武断。有时0.5秒就足够了,而其他时候我不得不把它设为1。在任何情况下,如果不加上一些睡眠延迟,它都不会起作用。这样做会减慢网络通话的速度,而且输入随机睡眠时间感觉不到防弹性能。在

对于如何在APN呼叫之间无延迟地工作有什么建议,或者对于所需的延迟是否有最佳实践?在

根据下面的请求添加更多代码。下面是一个类中的3个方法,我用它们来控制它:

class PushAdmin(webapp2.RequestHandler):

    retryAPNList=[]
    channelID=""
    channelName = ""
    userName=""

    apns = APNs(use_sandbox=True,cert_file="mycert.pem", key_file="mykey.pem", enhanced=True)

    def devChannelPush(self,channel,name,sendAlerts):
        ucs = UsedChannelStore()
        pus = PushUpdateStore()
        channelName = ""
        refreshApnList = pus.getAPN(channel)
        if sendAlerts:
            alertApnList,channelName = ucs.getAPN(channel)
            if not alertApnList: alertApnList=[]
            if not refreshApnList: refreshApnList=[]
            pushApnList = list(set(alertApnList+refreshApnList))
        elif refreshApnList:
            pushApnList = refreshApnList
        else:
            pushApnList = []

        self.retryAPNList = pushApnList
        self.channelID = channel
        self.channelName = channelName
        self.userName = name
        self.retryAPNPush()

    def retryAPNPush(self):
        token = -1
        payload = Payload(alert="A message from " +self.userName+ " posted to "+self.channelName, sound="default", badge=1, custom={"channel":self.channelID})

        if len(self.retryAPNList)>0:
            token +=1
            for x in self.retryAPNList:
                    self.apns.gateway_server.send_notification(x, payload, identifier = token)
                    time.sleep(0.5)

下面是调用类(缩写为reduce non-related items):

class ChannelStore(ndb.Model):
   def writeMessage(self,ID,name,message,imageKey,fileKey):
        notify = PushAdmin()

        notify.devChannelPush(ID,name,True)

下面是我对睡眠计时器的位置所做的一些微小的改变,似乎已经解决了这个问题。然而,我仍然担心在任何情况下给予的时间是否恰当。在

def retryAPNPush(self):
        identifier = 1
        token = -1
        payload = Payload(alert="A message from " +self.userName+ " posted to "+self.channelName, sound="default", badge=1, custom={"channel":self.channelID})

        if len(self.retryAPNList)>0:
            token +=1
            for x in self.retryAPNList:
                self.apns.gateway_server.send_notification(x, payload, identifier = token)
            time.sleep(0.5)

分辨率:

正如在底部的注释中所指出的,解决这个问题的方法是将下面的语句移到类之外的模块级别。这样做就不需要任何睡眠声明。在

apns = APNs(use_sandbox=True,cert_file="mycert.pem", key_file="mykey.pem", enhanced=True)

Tags: 方法selftokentrueapnsifchannelusername
1条回答
网友
1楼 · 发布于 2024-09-30 06:28:30

实际上,PyAPNS会自动为您重新发送丢弃的通知,请参见PyAPNS

因此,您不必自己重试,只需记录哪些通知具有错误标记。在

代码的行为可能是由保存在本地范围内(在if len(self.retryAPNList)>0:内)的APNS对象引起的

我建议您将APNS对象拉到类或模块级别,这样它就可以完成错误处理过程并重用TCP连接。在

请告诉我:)谢谢

相关问题 更多 >

    热门问题