如何在python和其他应用程序之间通信和共享数据?

2024-04-19 16:35:42 发布

您现在位置:Python中文网/ 问答频道 /正文

在较高的层次上,我需要做的是有一个python脚本,它根据从各种应用程序接收到的命令执行一些操作。在这个阶段,还不清楚应用程序是什么。它可以是另一个python程序、MATLAB应用程序或LAMP配置。命令很少被发送,大约每小时发送几次。在

问题是-对于python脚本来说,接收这些命令并向这些应用程序表明它已经接收到这些命令的最佳方式是什么?

现在,我要做的是有一个简单的.txt文件。应用程序将向文件写入命令。python脚本将读取它,执行它的任务,并从文件中删除该命令。在

我不喜欢这种方法有两个原因- 1) 如果文件由python编写/读取,而应用程序发送了一个新命令,会发生什么情况? 2) 这是一个复杂的方法,不会带来任何健壮和重要的结果。在


Tags: 文件方法命令程序txt脚本应用程序方式
2条回答

集成模式

可用于此目的的集成模式很少。在

消息传递允许通过通信约定的消息进行解耦,其余的都作为平台特定的细节保留,这不会影响其他方。在

另一种方法可以是共享数据存储——一方将处理请求存储在那里,另一方将获取请求并进行处理。在

使用ZeroMQ的消息传递集成模式

ZeroMQ是一个库,允许非常轻量级的消息传递,而不需要运行一些大型消息传递应用程序。在

你所描述的可以这样解决:

  • Python脚本正在循环中运行,等待执行某些操作的请求。在
  • 任何客户机(能够发出ZeroMQ请求)都会请求操作并获得响应

由于客户机使用多种语言,您应该使用一些跨平台的序列化,结果缓冲区甚至更好的JSON字符串都是不错的选择。在

ZeroMQ有许多语言库,因此您应该能够进行通信。在

有一个很好的ZeroMQ Guide提供了概念的清晰解释,并显示了许多语言的实现。在

为了规划通信基础设施,我将从您的Python脚本绑定到某个TCP端口(被“固定”部分)和连接到该端口的客户端开始。在

Python脚本将使用REP socket(用于“reply”),您的客户机使用其他语言REQ socket。在

以下示例来自zguide中为多种语言编写的huge set of examples

Python服务器代码示例(hwserver.py):

import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    # Wait for next request from client
    message = socket.recv()
    print("Received request: %s" % message)

    # Do some 'work'
    time.sleep(1)

    # Send reply back to client
    socket.send(b"World")

示例PHP客户端(hwclient.php):

^{pr2}$

共享数据存储集成

共享文件或数据库还允许进程之间进行通信。如果锁定资源、注意同一个任务不是由多个工人处理等,问题就变得复杂了

结论

有多种模式和多种平台需要实现。在

  • 数据库-你需要设置并运行它。对于一些小任务来说可能太多了。在
  • 共享文件-可能与从多个进程共享文件发生冲突-如果多个进程尝试写入,则可能存在冲突。在
  • 通过TCP或UDP套接字进行消息传递-冷工作,但实际上,这在技术上是非常重要的,因为它有许多必须解决的问题(当一方关闭时,重新连接…)
  • web服务上的消息传递-您可以设置web服务器,接受来自客户端的请求,在服务器上进行处理。对于快速任务来说,这是相当容易的,但是如果任务需要超过30秒,则可能会失败,并且必须使用某种消息传递将其转换为后台处理。在
  • 中型和大型的消息传递系统(比如Celery with RabbitMQ、Redis…)-有很好的工具,在许多情况下可能会被过度使用
  • ZeroMQ上的消息传递—这是我的最爱—您可以用几行代码设置它,并且运行时不会出现太多问题—它可以解决诸如重新连接之类的问题。等等,例如参见full working example for distributed locker

Python从早期阶段起就为ZeroMQ提供了一个非常舒适的PyZMQ绑定

MATLAB也可以有相同的直接ZeroMQ,用于多对多通信。在

故事就从这里开始。。。在

让我换个更广阔的视角

从一些关键的要点来看,这些要点是(pitty对此很满意,但羞耻感和烈焰都会落到各自的开发人员身上)

在我们今天遇到的其他软件工程“产品”和“堆栈”中并不常见:

[1]ZeroMQ首先是一个非常强大的概念,而不是代码或DIY工具包

[2]ZeroMQ对于任何专业级项目的最大优势都是而不是使用真正的可伸缩的正式通信模式端到端,而不是编码或“欺骗/修改”已发布的内部结构

由强大的MQ团队(强大的技术支持团队)在MQ的强大支持下进行了卓有成效的工作。在

说到这几条原则,我的建议是,花一点时间在概念上,,Peter Hintjens在ZeroMQ上出版的一本书(也有PDF格式)是一个值得开始的地方,以获得更大的图景。在

那么,就有了一个问题,那就是用几个SLOC-s来让这个世界变得最强大(相信我,这听起来很大胆,因为没有多少真正的替代品可以与ZeroMQ相比。。。好吧,ZeroMQ的联合架构师Martin Sustrik的[nanomsg]就是这种情况,至少可以提一提,如果您需要更高的速度/更低的延迟,但是上面的关键要点仍然是一样的,即使在那里……)在

在外汇高速交易基础设施环境中使用ZeroMQ编排的Python&MQL4&AI/ML系统只是一个很小的例子,其中微秒很重要,纳秒在队列中起作用。。。在

希望您对ZeroMQ library的兴趣只会增长&您将受益于这件杰出艺术品的许多其他用途所获得的巨大飞跃,并从酒吧/订阅、配对/配对,REQ/REP形式模式最符合您的MATLAB/Python/*异构多方/多主机项目的通信需求。在

敬请期待您的时间和努力

相关问题 更多 >