【问题标题】:Unable to get result of pubnub.time() in Python无法在 Python 中获得 pubnub.time() 的结果
【发布时间】:2019-03-11 23:31:50
【问题描述】:

调用时如何获得 pubnub.time() 的结果?这肯定和我对python不太了解有关...

我正在尝试调用 pubnub.time() 来测试网络连接何时恢复,以便 pubnub 可以重新连接并且我可以重新订阅必要的频道。我似乎无法获得所需的输出。根据pubnub docs,time() 有 3 个方法可以返回 int、string 或 date。

envelope = pubnub.time()

envelope.int()  outputs error
envelope.str()  outputs error
envelope.date_time()  outputs error

我唯一可以开始工作的是print(envelope),它产生<pubnub.endpoints.time.Time object at 0x75fb8f50>

我不会深入研究我在这方面尝试过多少次迭代,然后来寻求帮助。

更新

我们有几个远程系统,我们希望使用 PubNub 从连接到机器的硬件中收集数据点。数据请求会进来,PubNub 需要响应请求。我们的主要问题是这些偏远地区的 DSL 非常不稳定,一次会中断数小时到数天,而当我们的 python 应用程序仍在运行时,PubNub 不会重新连接。尝试使用 LINEAR 和 EXPONENTIAL 的 reconnect_policy 在互联网中断后都无法重新连接。不过,小而短的中断将恢复。除此之外,PubNub 非常适合这种设置。

这是我的设置配置

pnconfig = PNConfiguration()
pnconfig.subscribe_key = 'sub'
pnconfig.publish_key = 'pub'
pnconfig.reconnect_policy = 'PNReconnectionPolicy.EXPONENTIAL'
pnconfig.daemon = True
pnconfig.ssl = True

这是我们的订阅回调:

class MySubscribeCallback(SubscribeCallback):
    def presence(self, pubnub, presence):
        pass

    def status(self, pubnub, status):
        if status.is_error():
            logger.error("PN Error" + str(status.error_data.exception))

        if status.category == 
            PNStatusCategory.PNUnexpectedDisconnectCategory:
            logger.error("PN Unexpected Disconnect")
            pubnub.reconnect()
            pass

        elif status.category == PNStatusCategory.PNConnectedCategory:
            logger.info("PN Connected")

        elif status.category == PNStatusCategory.PNReconnectedCategory:
            logger.warning("PN Re-Connected")
            pubnub.subscribe().channels('devChannel').execute()
            pass

        elif status.category == PNStatusCategory.PNDecryptionErrorCategory:
            logger.error("PN Decryption Error")
            pass

【问题讨论】:

  • 您在设置 API 密钥配置吗?
  • 您不需要调用时间来 ping PubNub,而且您真的不应该这样做。您的用例详细信息是什么?发布、订阅等?越多越好。还有@exitcomestothis 所说的。
  • @KristopherIves - 是的,这是我的设置配置 pnconfig = PNConfiguration() pnconfig.subscribe_key = 'sub' pnconfig.publish_key = 'pub' pnconfig.reconnect_policy = 'PNReconnectionPolicy.EXPONENTIAL' pnconfig.daemon = True pnconfig.ssl = 真
  • @CraigConover - PN 将在远程设备上运行,该设备从与其连接的某些硬件收集数据点,因此它将是 pub 和 sub。当数据请求进来时,它会以结果作为响应。这些位置没有最好的 DSL,在测试过程中,如果我们模拟互联网中断超过 30 分钟,PN 永远不会恢复并且不会重新订阅。即使重新连接设置为线性和指数,也会发生这种情况。
  • @StephenBlum - 我可以提供任何额外的数据或日志文件吗?如果有帮助,我正在使用 Python 2.7.9。

标签: python pubnub


【解决方案1】:

PubNub SDK 在网络错误时重新连接

PubNub SDK 经久耐用,能够在不稳定的网络条件下维持套接字连接。虽然连接可能并不总是可用,但一旦网络连接恢复,PubNub SDK 应该自动重新创建套接字并下载任何丢失的消息。 PubNub Python SDK 应该遵循这一理念。

在您的示例代码中,您似乎正在设置reconnect_policy。但是,您的代码将重新连接策略变量设置为字符串 'PNReconnectionPolicy.EXPONENTIAL' 而不是 enum PNReconnectionPolicy.EXPONENTIAL

尝试对您的代码进行以下修改以利用重新连接策略:

from pubnub.enums import PNReconnectionPolicy       ## <-- Import Enumerator
from pubnub.pnconfiguration import PNConfiguration

## ... init ...

## Set Reconnection Policy using Enumerator
pnconf.reconnect_policy = PNReconnectionPolicy.EXPONENTIAL

SDK 的默认值为 pnconf.reconnect_policy = PNReconnectionPolicy.NONE。另一个有效选项是 pnconf.reconnect_policy = PNReconnectionPolicy.LINEAR

设置为 PNReconnectionPolicy.LINEAR 以进行自动重新连接。使用选项PNReconnectionPolicy.NONE 禁用自动重新连接。使用选项PNReconnectionPolicy.EXPONENTIAL 设置指数重试间隔。

参考资料:https://github.com/pubnub/python/search?q=PNReconnectionPolicy&unscoped_q=PNReconnectionPolicy

文档资料:https://www.pubnub.com/docs/python/api-reference-configuration#configuration-args-1

【讨论】:

  • 感谢您指出我的新手 python 错误,这解决了断开/重新连接问题。但是,我注意到的一件事是,一旦网络连接恢复,我们脚本的日志文件就会不断记录错误,指出 PN 无法连接。但这些仅在 PN 已经重新建立网络连接后才会出现。错误 - PN ErrorConnection 错误: ('Connection aborted.', error("(104, 'ECONNRESET')",)) 此错误每 5-30 分钟持续一次,并且持续到上周。使用 PNReconnectionPolicy.EXPONENTIAL。
  • 这听起来像是一个非常可怕的错误!错误日志行的爆炸式增长,哎哟。
  • @exitcomestothis 错误报告:发送电子邮件至 support@pubnub.com 将其作为官方错误提交。我已通知支持人员注意您的电子邮件。
  • 感谢您帮助解决此问题。在尝试通过支持复制日志记录问题后,这一定是我们的问题。再次感谢您的所有帮助,这无疑加速了我们与 PubNub 的集成 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
相关资源
最近更新 更多