让 PubNub 订阅者作为服务保持活动状态(Python SDK)

Keep a PubNub subscriber alive as a service (Python SDK)

我觉得愚蠢了。

我正在从 GPS/Bluetooth 个节点向 PubNub 发布消息。这工作正常。

我需要订阅 PubNub 频道并将消息导入数据库 24/7(基于 Django 的 PostgreSQL)。我使用数据库来绘制节点位置、添加密钥、注册用户等...

问题:此Python 脚本在execute() 后终止。我需要它才能永远活着。

# Set up the client params
pnconfig = PNConfiguration()
pnconfig.subscribe_key = 'sub-23948570947502475057205702354702547'
pnconfig.ssl = True

# Connect to PubNub and subscribe to a channel
pubnub = PubNub(config=pnconfig)
pubnub.add_listener(NodeSubscribeCallback())
pubnub.subscribe().channels('node_raw').execute()

问题:我如何运行订阅 PubNub 频道作为服务?换句话说,我怎样才能让我的脚本 Python 保持 运行ning?

我试过了:

作为服务(Python SDK)使 PubNub 订阅者保持活动状态

您可以使用数据库同步方法。您的代码即将完成。只需要一些点点滴滴。这是您实现目标所需的代码。

import pubnub

from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub          import PubNub, SubscribeListener

class DatabaseSync(SubscribeListener):
    def message( self, pubnub, data ):
        print( "Saving to Database: ", data.message )

pnconfig               = PNConfiguration()
pnconfig.subscribe_key = 'demo' ## Only Need SubKey
pnconfig.ssl           = True   ## Use TLS Socket
pubnub                 = PubNub(pnconfig)

pubnub.add_listener(DatabaseSync())
pubnub.subscribe().channels("node_raw").execute()

就是这样!使用 Python 获取同步到数据库的事件更改日志的超级简单易行的方法。素材来自PubNub Python Documentation and also an old gist learning Python by Example.

这是一个耗时的问题,我不确定确切的原因。我在最初 question/problem 中遵循了@Stephen Blum 的回答,但也许我遗漏了一些东西。

我在最初的问题中犯了一个遗漏错误:请注意,我是在 threading.Thread 中创建此订阅。我认为这是相关的。

以下是我解决问题的方法:


这里的关键是 run() 方法末尾的 signal.pause()

我认为它可以防止线程死亡 - 但我希望我的 NodeSubscribeCallback(如斯蒂芬的回答所示)。