PyAPN 和发送之间睡眠的需要

2024-03-02

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

apns.gateway_server.register_response_listener

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

for x in self.retryAPNList:
   apns.gateway_server.send_notification(x, payload, identifier = token)
   time.sleep(0.5)

如果我不使用睡眠计时器,则不会捕获任何错误,因此我的整个 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)

下面是调用类(为了减少不相关的项而省略):

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)

事实上,PyAPNS 会自动为您重新发送丢弃的通知,请参阅PyAPNS https://github.com/djacobs/PyAPNs#enhanced-message-with-immediate-error-response

因此,您不必自己重试,只需记录哪些通知有错误令牌即可。

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

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

如果有帮助请告诉我,谢谢:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyAPN 和发送之间睡眠的需要 的相关文章

随机推荐

  • 如何从memfd_create获取内存地址?

    在我的应用程序中我需要共享内存 父母和孩子之间 使用fork execl 我用memfd create分配内存 因为它提供了 文件描述符 可以方便地在子进程中使用 进程 描述符通过dup2 before execl 附加到分配的内存 我不使
  • 扁平列表和免费 monad

    我试图说服自己 List monad 具有平面列表 列表串联和按元素映射的列表 不是一个自由 monad 准确地说 是与某个函子 T 关联的自由 monad 据我了解 我应该能够通过以下方式实现这一目标 首先在 monad 列表中找到常用运
  • 如何将 JSON 转换为 GeoJSON

    我对 javascript 的学习还很陌生 我的基础知识已经碰壁了 我已经设置了一个传单地图 我希望从 JSON 中的绳索上绘制基于 divIcon 的标记 通过我无数次的研究 试图让它发挥作用 我了解到为什么我的 JSON 文件无法工作
  • Matplotlib imshow 中内存使用过多

    我有一个 PyQT4 应用程序 可以在 Matplotlib 图中显示中等大小的图像 我显示的测试图像约为 5Mb 2809 x 1241 像素 顺便说一下 我使用GDAL读取数据 图像被读入数组 其中无数据值被屏蔽 然后用标准化值和指定的
  • NetworkX - 删除节点并重新连接边

    我在图中有一个节点 充当一种 临时连接器 节点 我想删除该节点并更新图中的边 以便其所有直接前驱节点都指向其直接后继节点 是否有内置功能可以做到这一点networkx 或者我需要推出自己的解决方案吗 Example 我有一个图表1 gt 2
  • Kubectl设置环境变量并运行命令

    我有一个在 Kubernetes 上运行的容器 我想在其中从本地终端运行命令 基于其 yaml 文件的容器的工作目录位于 opt gopath src a 但是 我想在目录中运行命令 opt gopath src b 此外 在运行此命令之前
  • OpenCV 和 Python 的书籍? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何关闭ViteJS的模块热加载功能?

    我有一个服务器端渲染production模式Vite应用 我的问题是 网页通常会重新加载并且控制台将显示 vite connecting 我将此追溯到 vite 代码库的热模块重新加载部分 然而 我不想hmr on for producti
  • ggbiplot - 如何不在图中使用特征向量

    我有一个数据集数据 cell line sva 其暗淡为 313 11875 cc pca lt prcomp data cell line sva center TRUE scale TRUE retx TRUE g lt ggbiplo
  • Spring Boot 和 Maven 战争叠加

    我正在使用 Maven 多模块 其中一场战争取决于另一场战争 Spring Boot Web 应用程序依赖于一个仅提供 html 文件的基本 Web 应用程序 当我运行 Spring Boot 应用程序时 我可以从主 web 应用程序 Sp
  • 在 Scala 中使用 json 对象的 play 框架

    你好 我是 scala play 框架的初学者 我创建了一个简单的注册表单并连接到 mysql 来插入行 效果很好 现在我想在同一页面上显示这些插入的行 而不使用 json 刷新页面 请建议我一个想法如何在同一页面上获取插入的行 提前致谢
  • 需要知道每个字段是否已更改,我应该如何在 Hibernate 中对此进行建模

    所以我有一个包含三个字段的类 使用 hibernate 映射到一个表 Class Widget String field1 String field2 String field3 在应用程序启动时 许多实例这些小部件将从外部文件添加到数据库
  • 检索 SQL Server 中的日期; CURRENT_TIMESTAMP 与 GetDate()

    使用 SQL Server 哪一种是用于日期检索的最快或最佳实践方法 之间有区别吗CURRENT TIMESTAMP and GetDate CURRENT TIMESTAMP是标准的 ANSI SQL 因此理论上 如果您需要移动数据库 它
  • 正则表达式:用括号分割忽略引号内的嵌套括号

    我的程序将 SQL VALUES 多行字符串解析为单行字符串数组 典型的输入字符串如下所示 11 1 Service A nested parentheses en 22 2 Service B nested parentheses en
  • Rails:设计:用户确认注册后发送电子邮件

    我的应用程序正在使用 Devise 并且正确发送确认电子邮件 并在用户单击确认链接后正确确认用户 我还想在用户确认后发送第二封电子邮件 关于如何延迟确认或两步确认有很多建议 但没有关于我正在寻找的内容 我可以找到 Devise Module
  • 如何将 HTML 代码添加到 JSF FacesMessage

    默认情况下 每个 JSFFacesMessage以单行形式呈现 我想添加 HTML 换行符 br 消息本身 以便消息显示整齐 我尝试过如下 message new FacesMessage test br test 然而 它被 JSF 转义
  • 如何在另一个方法中的方法中使用局部变量?

    private void UserYoutubeService var youtubeService new YouTubeService new BaseClientService Initializer HttpClientInitia
  • 如何在 Node.js 中向子进程发送“CTRL+C”?

    I tried to spawn child process vvp https linux die net man 1 vvp https linux die net man 1 vvp At the certain time I nee
  • vTigerCRM 7 - 除非手动触发,否则调度程序不会运行任何 cron 作业

    我正在运行 vTiger 7 0 我注意到在这个月的第一天 我没有创建任何发票 然后我查看了调度程序 注意到 上次扫描开始 和 上次扫描结束 字段显示几天内没有任何 cron 作业被触发 cron 作业计划以 15 分钟的间隔触发一次 但
  • PyAPN 和发送之间睡眠的需要

    我正在使用 PyAPN 向 iOS 设备发送通知 我经常一次发送多组通知 如果任何令牌因任何原因损坏 该过程将停止 因此 我使用增强的设置和以下方法 apns gateway server register response listene