【问题标题】:Is mixing Clojure with Python a good idea?将 Clojure 与 Python 混合是个好主意吗?
【发布时间】:2012-05-11 20:16:03
【问题描述】:

我正在从事一个涉及大量基于 Web 和 AI 工作的大型项目。我对 Python 非常满意,尽管我唯一关心的是并发编程和扩展这个项目以使其在集群上工作。因此,Clojure for AI 和对 Java 函数调用的支持带来了并发编程。

使用 Python 完成所有基于 Web 的 api 工作并让 Clojure 处理大部分并发 AI 工作是否是个好主意?

编辑: 让我详细解释一下交互。 Python 将完成大部分繁琐的工作(抓取、图像处理、改进数据库等等)。如果可能,Clojure 将处理数据库或从 Python 获取数据。我除了一些 CPython 与 Python 和 Clojure 的链接。

编辑2: 问这个问题可能是个愚蠢的问题,但这是一个相当长期的项目,会发生相当大的演变并经历多次迭代,Clojure 是一种语言吗?够便携吗?

【问题讨论】:

  • 你认为这些层之间的接口是什么样的?杰通?共享数据库后端?消息队列? ...?就目前而言,这个问题太宽泛了,无法回答。
  • 稍微更新了问题。我很困惑自己将哪个任务分配给谁以及如何使交互起作用。任何建议都将受到欢迎。
  • 不要越过溪流!
  • @Puck 如果你想直接在语言之间进行调用,到目前为止更简单的方法是使用 JVM——所以是 Jython,而不是 CPython。在 Python 中做“肮脏的工作”似乎不是最理想的——即使在考虑线程之前,JVM 也比 CPython 运行时快得多。
  • 我认为可以肯定地说 Clojure 将继续存在。 (而现在,即使是精品语言也倾向于生存。毕竟,生产就绪语言现在是免费的。购买编译器不再需要 600 美元。)至于可移植性,Clojure 应该像 Java 一样可移植,所以是的,非常可移植.我真的看不出有任何理由不使用 Clojure。 (虽然还有很多其他很棒的选择!)

标签: python clojure


【解决方案1】:

我构建了一个令人尴尬的并行数字运算应用程序,其后端使用 Clojure(在任意数量的机器上),前端使用 Ruby on Rails。我不是特别喜欢 RoR,但当时这是一个零预算项目,我们手头有一位愿意免费工作的 Rails 程序员。

Clojure 部分由(大致)一个控制器、数字处理节点和一个实现 JSON-over-HTTP API 的服务器组成,该 API 是 Rails Web 应用程序的接口。 Clojure 节点使用 RabbitMQ 相互通信。因为我们在应用程序的不同部分之间定义了清晰的 API,所以以后在 Clojure 中重写前端很容易(因为这更适合我们的需要)。

如果您正在处理一个具有较长生命周期和持续开发工作的分布式项目,那么将应用程序设计为通过定义明确的 API(json、bson、...通过 AMQP、HTTP、... 或数据库)。这意味着您可以使用自己熟悉的语言快速开始,如有必要,可以在稍后阶段用另一种语言重写部分内容。

【讨论】:

  • 这看起来几乎和 OP 的场景一模一样,除了换掉 Python 和插入 RoR。
【解决方案2】:

我看不出将 Python 用于 Web 应用程序和 Clojure 用于并发数据处理/后端代码有什么大问题。我假设您会使用 JSON over http 之类的东西来进行两者之间的通信,这应该可以正常工作。

我个人会同时使用 Clojure(例如,使用出色的 Noir 作为 Web 框架,使用 Korma 作为数据库的东西。),但如果你说你的经验主要是在 Python 中,那么它可能是有道理的从生产力的角度(至少在短期内)坚持使用 Python。

回答有关 Clojure 未来的问题:

  • 肯定会留在这里。它有一个非常活跃的社区,并且可能是目前“最热门”的 JVM 语言之一(与 Scala 和 Groovy 并驾齐驱)。它似乎在大数据/分析领域做得特别好
  • Clojure 在库支持方面具有特殊优势,因为它可以轻松使用任何 Java 库。从实用的角度来看,这对于新语言来说是一个巨大的优势,因为它可以立即解决通常是启动新语言生态系统的最大问题之一。
  • Clojure 是一种新的语言,它仍在进行大量的开发。如果您选择使用 Clojure,您应该意识到您需要付出一些努力来保持最新状态并让您的代码与最新的 Clojure 版本保持同步。我个人认为这不是问题,但对于习惯于使用更“稳定”语言(如 Java)的人来说,这可能会让他们感到惊讶。
  • Clojure 非常便携 - 它基本上可以在任何可以获得相当现代的 JVM 的地方运行,如今几乎无处不在。

【讨论】:

    【解决方案3】:

    如果您可以构建双方以使用数据和纯(ish)函数进行通信,那么这应该会很好。将您的 clojure 函数包装在采用并返回 JSON(或更优选地 clojure 形式)的 Web 服务中应该使您的基于 Python 的前端可以访问它们,这不会额外大惊小怪。

    当然,全程用 Clojure 编写会更有趣。 ;)

    如果这是一个长期项目,那么构建交换数据的干净功能(如获取和返回值)接口变得更加重要,因为它将使您能够独立地发展组件。

    【讨论】:

    • 感谢您的回答。第二次编辑问题。看看吧。
    【解决方案4】:

    在这种情况下,我个人喜欢按以下顺序开始。

    • 将系统划分为子系统,对每个系统的功能进行“非常明确”的定义,并且该定义应遵循“只做一件事,保持简单”的原则。在这个阶段不要考虑语言等。
    • 选择运行这些子系统的平台(不是语言)。例如:JVM、Python VM、NodeJs、CLR(Mono)、其他 VM。尝试选择几个平台,或者如果可能的话只选择一个,因为这确实会使复杂性方面的生活变得更轻松。
    • 选择对这些平台进行编程的语言。这是非常主观的,但对于 JVM,您可以使用 Clojure 或 Jython(如果您像我一样喜欢动态语言)。

    就 Clojure 的未来而言,这是一种由“优秀程序员社区”而非某些公司开发的语言。我希望这能消除您对 Clojure 的“长期”关注的疑虑。顺便说一句,Clojure 是 LISP,因此您可以按照自己的方式修改语言并自行修复,即使有人不为您这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2010-11-05
      • 2014-02-10
      相关资源
      最近更新 更多