来自PyPubSub:
Pypubsub为您的Python应用程序提供了一种简单的方法来解耦其组件:应用程序的某些部分可以发布消息(有或没有数据),其他部分可以订阅/接收它们.这允许消息"发件人"和消息"听众"彼此不知道:
- 一个不需要导入另一个
- 发件人不需要知道
- "谁"得到消息,
- 听众会对数据做些什么,
- 或者即使任何听众都会收到消息数据.
- 同样,听众也不必担心消息的来源.
这是实现模型 - 视图 - 控制器架构或促进其组件解耦的任何类似架构的绝佳工具.
似乎有相当多的Python模块用于在Web上发布/订阅,从PyPubSub到PyDispatcher,再到简单的"自制"类.
比较不同的模块时是否有特定的优点和缺点?哪些模块已经过基准测试和比较?
提前致谢
我正在用 Python开发一个多线程应用程序。特别是,在这个应用程序中,一个线程应该能够生成一个应该通知一个(或多个)线程的事件;接收事件通知的线程应中断其执行并运行特定函数。在这个服务功能结束时,他们应该回去做他们在事件生成之前正在做的事情。
为了做这样的事情,我正在考虑使用某种发布/订阅模块。我发现了一个非常容易使用的:PyPubSub。你可以在这里找到一个关于如何使用它的非常简单的例子。
顺便说一句,当我开始使用它时,我意识到它可以满足我的要求,但前提是您只使用processes。如果您有更多线程,它会暂停整个进程(因此,其中的所有线程)以运行特定例程。这实际上不是我正在寻找的行为。不幸的是,我无法将我的应用程序从多线程更改为多进程。
你知道有什么模块可以帮助我在多线程应用程序中做我想做的事情吗?谢谢。
我在 python3.6 中使用 Google Pub/Sub 客户端 v2.2.0 作为订阅者。
我希望我的应用程序在确认它已经收到的所有消息后正常关闭。
来自 Google 指南的订阅者的示例代码,稍作改动将显示我的问题:
from concurrent.futures import TimeoutError
from google.cloud import pubsub_v1
from time import sleep
# TODO(developer)
# project_id = "your-project-id"
# subscription_id = "your-subscription-id"
# Number of seconds the subscriber should listen for messages
# timeout = 5.0
subscriber = pubsub_v1.SubscriberClient()
# The `subscription_path` method creates a fully qualified identifier
# in the form `projects/{project_id}/subscriptions/{subscription_id}`
subscription_path = subscriber.subscription_path(project_id, subscription_id)
def callback(message):
print(f"Received {message}.")
sleep(30)
message.ack()
print("Acked")
streaming_pull_future = subscriber.subscribe(subscription_path, callback=callback) …Run Code Online (Sandbox Code Playgroud) python publish-subscribe google-cloud-platform google-cloud-pubsub pypubsub