【问题标题】:Keep a PubNub subscriber alive as a service (Python SDK)让 PubNub 订阅者作为服务保持活跃(Python SDK)
【发布时间】:2018-07-20 17:09:24
【问题描述】:

我觉得如此愚蠢。

我正在从 GPS/蓝牙节点向 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 保持我的脚本运行?

我试过了

  • 基于threading.Thread 运行几个单独的类PubNub
  • while True: time.sleep(10)execute() 之后
  • 谷歌搜索时间
  • signal.pause() 在我的脚本末尾

【问题讨论】:

  • 您好,是的,您可以这样做,这将很快提供一个工作示例。

标签: python python-multiprocessing pubnub


【解决方案1】:

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

您可以使用数据库同步方法。您的代码即将完成。只需要更多的零碎东西。这是实现目标所需的代码。

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,也是老手学习Python by Example

【讨论】:

  • 嘿谢谢!!我试过这个 - 实际上NodeSubscribeCallback 与您的DatabaseSync 课程非常相似。当然,不是print,而是将消息保存到数据库中。 signal.pause() 的不同位置最终对我来说是成功的。您可以在下面查看代码。现在我正试图让该脚本作为一个独立的进程运行,以便在解释器死亡时继续存在。
  • 太棒了!如果您使用的是systemdupstart,我们可以提供一些提示。
  • 我没有使用那些服务 - 这会使这更容易。问题是我需要根据来自 PubNub 的流数据动态管理/跟踪来自 Django 的守护进程......所以这对我来说意味着少量的复杂性。
【解决方案2】:

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

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

这是我解决问题的方法:


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

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

【讨论】:

  • @StephenBlum 我觉得一个真正的“开发人员”会知道该做什么,然后去做。我更像是一只鸡,无果而终地啄食直到找到虫子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2012-05-10
相关资源
最近更新 更多