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

时间:2014-06-11 17:59:41

标签: python database web-applications ipc

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

问题是 - 我的python脚本接收这些命令的最佳方法是什么,并向这些应用程序表明它已收到它们?

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

我不喜欢这种做法有两个原因 - 1)如果python正在写入/读取文件并且应用程序发送了新命令会发生什么? 2)这是一种复杂的方法,不会产生任何强大和重要的东西。

2 个答案:

答案 0 :(得分:2)

集成模式

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

消息传递允许通过传达合同消息进行解耦,其余所有内容都作为平台特定细节保留,这不会影响其他方。

其他方法可以是例如共享数据存储 - 一方将存储处理请求,另一方将获取它们并进行处理。

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

ZeroMQ是一个库,允许非常轻松的消息传递,而无需运行一些大的消息传递应用程序。

您所描述的内容可以通过这种方式解决:

  • Python脚本在循环中运行,等待要做的事情。
  • 任何客户(能够发出ZeroMQ请求)都会要求采取行动并获得回复

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

ZeroMQ拥有多种语言的库,因此您可以进行交流。

很棒ZeroMQ Guide提供了明确的概念解释,并以多种语言显示实现。

为了规划通信基础设施,我将首先将您的Python脚本绑定到某个TCP端口(正在修复"部分)并将您的客户端连接到它。

Python脚本将使用REP套接字(用于"回复"),您的客户端使用其他语言的REQ套接字。

以下示例来自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):

<?php
/*
* Hello World client
* Connects REQ socket to tcp://localhost:5555
* Sends "Hello" to server, expects "World" back
* @author Ian Barber <ian(dot)barber(at)gmail(dot)com>
*/

$context = new ZMQContext();

// Socket to talk to server
echo "Connecting to hello world server...\n";
$requester = new ZMQSocket($context, ZMQ::SOCKET_REQ);
$requester->connect("tcp://localhost:5555");

for ($request_nbr = 0; $request_nbr != 10; $request_nbr++) {
    printf ("Sending request %d...\n", $request_nbr);
    $requester->send("Hello");

    $reply = $requester->recv();
    printf ("Received reply %d: [%s]\n", $request_nbr, $reply);
}

通过共享数据存储集成

共享文件或数据库还允许进程之间的通信。锁定资源,注意多个工作人员不处理相同的任务等问题变得复杂。

结论

有多种模式和多个平台可供实施。

  • 数据库 - 您需要进行设置并使其运行。对于一些小任务来说可能太多了。
  • 共享文件 - 与多个进程共享文件可能存在冲突 - 如果多个进程尝试写入,则可能存在冲突。
  • 通过TCP或UDP套接字进行消息传递 - 冷却工作,但实际上这在技术上并不重要,因为它有许多必须解决的角落(当一方关闭时,该怎么办,重新连接......)
  • 通过Web服务发送消息 - 您可以设置Web服务器,接受来自客户端的请求,在服务器上进行处理。这对于快速任务来说相当容易,但如果任务花费超过30秒,您可能会失败并且必须将其转换为后台处理 - 使用某种消息传递。
  • 中等规模和庞大的消息传递系统(如Celery with RabbitMQ,Redis ......) - 拥有出色的工具,在很多情况下可能会出现过度杀伤
  • 通过ZeroMQ进行消息传递 - 这是我最喜欢的 - 您可以在几行代码中设置它并在没有太多问题的情况下运行 - 它解决了重新连接等问题。等等。见full working example for distributed locker

答案 1 :(得分:1)

Python从早期开始就为ZeroMQ提供了非常舒适的PyZMQ绑定

MATLAB可以使用相同的,直接的ZeroMQ,用于您的多对多通信。

这里的故事才刚刚开始......

让我从更广泛的角度来看,

来自少数,但主要原则(可怜的,但羞耻和火焰分别到各自的开发区)

在其他软件工程&#34;产品&#34;中并不常见&安培; &#34;叠层&#34;我们今天在我们周围见面:

[ 1 ] ZeroMQ首先是非常强大的概念 ,而非代码或DIY套件

[ 2 ] ZeroMQ的最大加适用于任何专业级项目坐着,而不是使用真正的可扩展的正式通信模式端到端,不是编码片段的能力,也不是&#34;技巧/模式&#34;已发表的内部文件

[ 3 ] ZeroMQ团队做了一项了不起的工作,并且保存用户不再重新发明轮子(&#34;内部&#34;)并允许宁愿停留通过在ZMQ抽象范围后重复使用英雄知识(由ZeroMQ专家,支持者和团队成员进行详细,完善和测试),在最有效的方面。

说了这几条原则之后,我的建议是宁愿在概念上花费大量时间,Peter Hintjens在ZeroMQ上发表的一本书(也提供PDF格式)是值得一去的地方。 ,以获得更大的图景。

然后,这将是一个几个SLOC-s的问题,使这些世界最强大(并相信我,这听起来只是一见钟情,因为没有很多真正的替代品来比较ZeroMQ。 ..好吧,ZeroMQ的共同架构师Martin Sustrik的[ nanomsg ]就是这种情况,至少提到一个,如果你需要更高的速度/更低的延迟,但是以上关键主要观点即使在那里也保持不变......)

使用了ZeroMQ编排的Python&amp; MQL4&amp; FOREX高速交易基础设施环境中的AI / ML系统只是一个小例子,其中微秒和纳秒在队列中产生差异......

公平地希望您对ZeroMQ图书馆的兴趣只会增长&amp;你将受益于这一辉煌艺术品的许多其他用途已经获得巨大的飞跃和得益于PUB / SUB,PAIR / PAIR,REQ / REP正式模式最符合MATLAB / Python / *异构多方/多主机项目的通信需求。

敬请关注 - 值得您花时间和努力