Python 进程间通信 - Twisted, RabbitMQ

5 投票
2 回答
4587 浏览
提问于 2025-04-17 14:41

我想用Python创建两个应用程序,它们需要能够互相通信。其中一个应用程序要像服务器一样工作,另一个则是客户端的图形界面(GUI)。这两个应用程序可以在同一台机器上运行,也可以在不同的设备上远程运行。

我想请教一下,应该使用什么技术呢?是用AMQP消息传递(比如RabbitMQ),还是用像TwistedTornado这样的服务器,或者用ZeroMQ来连接这些应用程序?将来我还想要一些认证等功能。

我已经读了很多问题和文章(比如这篇:为什么我们需要使用RabbitMQ),很多人都说“RabbitMQ和Twisted是不同的”。我知道它们确实不同。我很想了解它们之间的区别以及在这种情况下,为什么其中一个解决方案会比另一个更好。

补充说明:我希望使用它来满足以下要求:

  1. 会有多个用户同时连接 - 我想会有1到10个用户同时连接到同一个程序,并且他们会协同工作。
  2. 发送的数据是“消息”,告诉我们用户做了什么 - 有点像远程调用(但不要太关注这一点,因为图形界面可以用不同的语言编写,所以消息会像是一些json信息)。
  3. 系统应该支持协作工作 - 所以它应该尽可能互动。(数据会在用户输入或执行某个操作时不断发送)。

另外,我也想听听为什么某个解决方案在其他情况下会比另一个更好。

2 个回答

1

当有人告诉你Twisted和RabbitMQ是不同的,其实是因为比较这两者就像在比较两个目标不同的东西。

Twisted是一个异步框架,类似于Tornado。而RabbitMQ是一个消息队列系统。这两者不能直接比较。

你应该把你的问题拆分成两个新问题,第一个是我应该使用什么协议来让我的程序之间进行通信?这个问题的答案可能涉及到一些术语,比如amqp、Protocol Buffers等等。

第二个问题是我应该使用哪个框架来编写我的客户端和服务器程序?在这里,答案可能是Twisted、Tornado等。

10

Twisted是用来解决C10k网络问题的,它通过一种叫做反应器模式的方式,提供了异步网络功能。使用Twisted很方便,因为它提供了一种很好的并发抽象,而在Python中,线程和并发的处理没有像Erlang那样简单。因此,有些人会用Twisted来分配工作任务,但其实这并不是它的主要用途。

RabbitMQ是基于消息队列模式的。它主要关注的是可靠的消息传递,而不是网络连接。我特别强调可靠这一点,因为有很多不同的异步网络框架(比如Vert.x)也提供消息传递功能(也叫发布/订阅)。

很多时候,人们会把这两种模式结合起来,创建一个“消息总线”,以满足各种网络需求,避免不必要的网络阻塞,同时实现良好的集成和可扩展性。

“消息队列”和网络“反应器循环”搭配得很好,原因在于你不应该在反应器循环中阻塞,所以你需要把阻塞的工作分配给其他进程(比如线程、轻量级进程、独立机器进程、队列等)。实际上,最干净的做法就是使用分布式消息传递。

根据你的需求,如果你希望结果能立即显示并且能够扩展,听起来你应该使用异步网络。不过,如果你只有少量客户,简单的轮询系统也许就能满足你的需求。那么问题是,你总共有多少用户(Twisted)?你希望更新的可靠性有多高(RabbitMQ)?最后,你希望你的架构能够跨语言和平台使用吗……也许你以后想用Node.js(那就专注于消息队列而不是异步网络……也就是RabbitMQ)。个人建议你可以看看Vert.x,它允许你用Python编写代码。

撰写回答