修改 Python 的 Pubnub 状态检测信号
Modifying Pubnub presence heartbeat for Python
根据存在文档,Pubnub 将在 5 分钟未收到心跳后触发超时存在事件。
我需要修改此值,但找不到使用 Python SDK 执行此操作的方法。这是 Pubnub 文档的 link,展示了如何使用 JavaScript 来做到这一点:http://www.pubnub.com/docs/web-javascript/presence#optimizing_timeout_events
有谁知道如何使用 python SDK 实现此目的?
非常感谢。
编辑:我的客户不是 javascript 客户。它们是 python 个控制台应用程序。
PubNub Python SDK 存在
因为 Python 很少用作 客户端 ,所以 PubNub Python SDK's presence API 的实施不如 传统的 [=54] =] 客户端 SDK(JavaScript,等等)。因此,Pubnbub 初始化器中没有心跳参数,也没有 setter 或 attribute ,因此您不得不坚持使用默认的 5 分钟检测信号设置。
但是,对于 PubNub JavaScript SDK,当您使用自定义 heartbeat
(例如 60 秒)初始化 PUBNUB 时,heartbeat
key/value 将作为REST 中的查询参数 URL:
http://pubsub.pubnub.com/subscribe/demo/my_channel/0/14411482999795083?uuid=12345&pnsdk=PubNub-JS-Web%2F3.7.14&heartbeat=60
因此,如果您真的想要,您可以使用 REST 调用进行订阅并以这种方式传递 heartbeat
。
我第一次发布此答案时忘记提及的是,您的客户端负责至少每 60 秒 ping PubNub 服务器一次,最好每隔 30 秒一次,即 60 秒心跳 window服务器已为此客户端配置。
使用 PubNub SDK,这是在同一连接上的单独线程中完成的(某种程度上 - 至少在某种程度上,服务器知道它是设置心跳的同一客户端)。
即是说,我们正在使用 REST 进入一个不那么简单的解决方案,所以为什么还要使用 SDK。我们更新 Python SDK 比您做所有脏活累活要容易得多。我们会这样做,但不是在短期内,而是希望在 Python SDK 的下一个次要版本中。
根据我们的 off-SO 对话,您只想缩短 window 客户端看起来在线的时间,而实际上客户端未连接并且无法在连接已关闭(使用您应用的 UI 或命令行关闭终端而不是 "logging off")。
你可以做的是实现一个ping/ack握手协议。这是非常高的水平,因此可能需要填写一些更精细的点,但它应该提供一般概念。
- 在一个客户端(发送方)与另一个(接收方)进行通信之前,只需在客户端的 private[= 上向另一个客户端发送 ping 消息54=] 频道(每个客户端都会订阅该客户端独有的频道:例如,private_client001、private_client002 等)。
- 接收客户端将在发送方的唯一通道上自动确认(这将是 ping 消息有效负载的一部分)
- 如果 ping 的发送者在一秒钟内(或任何适合您的时间容差)没有收到确认消息,则假设接收者不在线。
- 当接收方重新上线时,您会收到错过的消息,并且任何 ping 不到 5 分钟,您可以回复并查看发件人是否还想参与。
这是许多用例(尤其是聊天)的常见问题,因为总是有 window 的时间(心跳 window)客户端可能真的离线但看起来是在线,因为他们没有以适当的、可预测的方式离开,这种方式会产生明确的 unsubscribe
,从而导致 leave
事件。因此,实施这种 握手预连接 协议是一种很好的做法。
Heartbeat 可以像这样用猴子修补到 Pubnub
class 中:
from pubnub import Pubnub
class PubnubHeartbeat(Pubnub):
def __init__(self, heartbeat=300, **kwargs):
self.heartbeat = heartbeat
super(PubnubHeartbeat, self).__init__(**kwargs)
def getUrl(self, request):
if "subscribe" in request['urlcomponents'][:2]:
if "urlparams" not in request:
request['urlparams'] = {}
request['urlparams']['heartbeat'] = self.heartbeat
return super(PubnubHeartbeat, self).getUrl(request)
p = PubnubHeartbeat(
subscribe_key="demo",
publish_key="demo",
heartbeat=60
)
def recv(msg):
print msg
p.subscribe(channels="heartbeat_test", callback=recv)
不建议将此用于长期生产代码(除非您在安装期间使用 pubnub==3.7.3
固定 Pubnub 依赖项)。示例 subclass 使用未记录的方法注入 heartbeat
URL 参数。 (请参阅 Craig Conover 的回答以了解其作用的描述)。
根据存在文档,Pubnub 将在 5 分钟未收到心跳后触发超时存在事件。 我需要修改此值,但找不到使用 Python SDK 执行此操作的方法。这是 Pubnub 文档的 link,展示了如何使用 JavaScript 来做到这一点:http://www.pubnub.com/docs/web-javascript/presence#optimizing_timeout_events
有谁知道如何使用 python SDK 实现此目的?
非常感谢。
编辑:我的客户不是 javascript 客户。它们是 python 个控制台应用程序。
PubNub Python SDK 存在
因为 Python 很少用作 客户端 ,所以 PubNub Python SDK's presence API 的实施不如 传统的 [=54] =] 客户端 SDK(JavaScript,等等)。因此,Pubnbub 初始化器中没有心跳参数,也没有 setter 或 attribute ,因此您不得不坚持使用默认的 5 分钟检测信号设置。
但是,对于 PubNub JavaScript SDK,当您使用自定义 heartbeat
(例如 60 秒)初始化 PUBNUB 时,heartbeat
key/value 将作为REST 中的查询参数 URL:
http://pubsub.pubnub.com/subscribe/demo/my_channel/0/14411482999795083?uuid=12345&pnsdk=PubNub-JS-Web%2F3.7.14&heartbeat=60
因此,如果您真的想要,您可以使用 REST 调用进行订阅并以这种方式传递 heartbeat
。
我第一次发布此答案时忘记提及的是,您的客户端负责至少每 60 秒 ping PubNub 服务器一次,最好每隔 30 秒一次,即 60 秒心跳 window服务器已为此客户端配置。
使用 PubNub SDK,这是在同一连接上的单独线程中完成的(某种程度上 - 至少在某种程度上,服务器知道它是设置心跳的同一客户端)。
即是说,我们正在使用 REST 进入一个不那么简单的解决方案,所以为什么还要使用 SDK。我们更新 Python SDK 比您做所有脏活累活要容易得多。我们会这样做,但不是在短期内,而是希望在 Python SDK 的下一个次要版本中。
根据我们的 off-SO 对话,您只想缩短 window 客户端看起来在线的时间,而实际上客户端未连接并且无法在连接已关闭(使用您应用的 UI 或命令行关闭终端而不是 "logging off")。
你可以做的是实现一个ping/ack握手协议。这是非常高的水平,因此可能需要填写一些更精细的点,但它应该提供一般概念。
- 在一个客户端(发送方)与另一个(接收方)进行通信之前,只需在客户端的 private[= 上向另一个客户端发送 ping 消息54=] 频道(每个客户端都会订阅该客户端独有的频道:例如,private_client001、private_client002 等)。
- 接收客户端将在发送方的唯一通道上自动确认(这将是 ping 消息有效负载的一部分)
- 如果 ping 的发送者在一秒钟内(或任何适合您的时间容差)没有收到确认消息,则假设接收者不在线。
- 当接收方重新上线时,您会收到错过的消息,并且任何 ping 不到 5 分钟,您可以回复并查看发件人是否还想参与。
这是许多用例(尤其是聊天)的常见问题,因为总是有 window 的时间(心跳 window)客户端可能真的离线但看起来是在线,因为他们没有以适当的、可预测的方式离开,这种方式会产生明确的 unsubscribe
,从而导致 leave
事件。因此,实施这种 握手预连接 协议是一种很好的做法。
Heartbeat 可以像这样用猴子修补到 Pubnub
class 中:
from pubnub import Pubnub
class PubnubHeartbeat(Pubnub):
def __init__(self, heartbeat=300, **kwargs):
self.heartbeat = heartbeat
super(PubnubHeartbeat, self).__init__(**kwargs)
def getUrl(self, request):
if "subscribe" in request['urlcomponents'][:2]:
if "urlparams" not in request:
request['urlparams'] = {}
request['urlparams']['heartbeat'] = self.heartbeat
return super(PubnubHeartbeat, self).getUrl(request)
p = PubnubHeartbeat(
subscribe_key="demo",
publish_key="demo",
heartbeat=60
)
def recv(msg):
print msg
p.subscribe(channels="heartbeat_test", callback=recv)
不建议将此用于长期生产代码(除非您在安装期间使用 pubnub==3.7.3
固定 Pubnub 依赖项)。示例 subclass 使用未记录的方法注入 heartbeat
URL 参数。 (请参阅 Craig Conover 的回答以了解其作用的描述)。