【问题标题】:Writing a Python data analysis server for a Java interface为 Java 接口编写 Python 数据分析服务器
【发布时间】:2012-06-28 16:17:15
【问题描述】:

我想为 Java 接口编写数据分析插件。该接口可能在不同的计算机上运行。该接口将发送命令,Python 程序可以返回大数据。该接口由 Java Webstart 系统分发。两者都从 MySQL 服务器访问主要数据。

实施沟通有哪些不同的方式和优势?当然,我在网上做了一些研究。虽然有很多建议,但我仍然不知道有什么区别以及如何决定一个。 (我对他们一无所知)

我找到了使用套接字的建议,这似乎很好。为每个连接编写一个专门用于 Python 分析过程的服务器是否简单(临时数据可能会在该特定客户端的一次通信请求后保留)?

我正在考虑学习如何使用套接字和传递 YAML 字符串。 也许我的主要问题是:与 RabbitMQ、ZeroMQ、CORBA、SOAP、XMLRPC 等系统有什么关系和优势?

还有使用管道或共享内存的建议。但这不符合我的要求?

这些方法是否有利于调试或其他特性?

我希望有人能帮助我了解技术并帮助我决定解决方案,因为很难从技术描述中判断。

(我不考虑 Jython、JEPP 等解决方案...)

【问题讨论】:

    标签: python sockets ipc


    【解决方案1】:

    就您描述的优点提供意见,听起来您正在处理可能需要大量时间来获取和序列化的潜在大数据/查询,在这种情况下,您肯定想要使用可以处理并发的东西没有堆叠线程的连接。因此,在 Python 领域,除了 Twisted,我不能推荐任何网络库。

    http://twistedmatrix.com/documents/current/core/examples/

    无论您决定使用普通 HTTP 还是您自己的协议,twisted 几乎都是并发网络的一站式商店。当然,这个名字被广泛使用,文档是亚特兰蒂斯,但如果你花时间学习它,在网络领域几乎没有什么是你无法完成的。您可以扩展基本协议和工厂,使一台服务器可以在基于反应器的事件循环中处理您的数据,并在准备好时响应延迟请求。

    序列化格式实际上取决于数据的性质。作为响应输出的内容中会有任何二进制文件吗?复杂类型?如果是这样,那排除了 JSON,尽管这正在成为最常见的序列化格式。 YAML 有时似乎在 python 社区中享有特权 - 我没有广泛使用它,因为我对连续剧所做的大部分工作都是使用 javascript 在前端呈现数据。

    当您需要推迟后台任务而不挂起响应时,消息队列确实是工具箱中最重要的工具。它们通常用于 Web 应用程序中,其中 HTTP 请求不应挂起,直到需要进行的任何复杂处理完成,因此 UI 可以及早呈现并依靠隐含的“承诺”处理将发生。它们有两个重要的特征:它们依赖于最终的一致性,因为该过程可以在协议中的响应发送很长时间后完成,并且它们还具有故障安全和重试指令,以防任务失败。它们是您提交“尽快完成这项非常艰巨的任务,我相信您会完成”问题域的地方。

    如果我们不是在谈论潜在的巨大响应体,以及序列化输出中相对简单的数据类型,那么在 Twisted 中滚动一个简单的 HTTP 延迟服务器并没有错。

    【讨论】:

    • 谢谢!这真是一个很好的解释。你的意思是twisted避免了我在线程上会遇到的一些问题(我也不知道)?但是我仍然可以拥有单独的服务器进程来在一个连接客户端的请求之间保持通信状态? HTTP 有一些限制,对于简单的命令,YAML 的原始传输是否可以?响应可能包含 MB 大小的数据。如果每个客户端连接有一个线性进程,我似乎不需要队列?
    • Twisted 让您定义自己的协议,该协议本质上是如何制定握手、“谁发送什么时间”和连接合同的定义。 HTTP 本身只是其中之一,它定义了响应和请求的语法。 Twisted 的美妙之处在于反应器模式,它将通过以编程方式处理事件循环来消除对操作系统线程的需求。您可以在协议中维护状态,与无状态 HTTP 不同,有大量的聊天服务器示例教程可以做到这一点。它真的是一个网络库,而不仅仅是一个简单的 http 监听器。
    猜你喜欢
    • 2018-11-03
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多