3

我想建立一个 jython 和 python 通信链接。我有一个 django 应用程序和 python 脚本,用于前端并执行系统管理/自动化任务。我将 jython 用于 Weblogic 9/10。我想做的事情是让我可以向 jython 系统发出请求。例如带有参数 a,b,c 的任务 A,然后在完成后返回一条消息。

我想这样做是因为 wlst 或 jython 启动速度很慢,当我需要进行部署或检查服务器或服务器的状态(现在最多 100 个)时,这样做会很痛苦。那么,在保持 jython/(wlst) 系统处于活动状态并且可以轻松共享/发出请求的同时,将信息共享回主脚本或 python 类是最简单的方法吗?

我一直这样做的方式是使用泡菜对象。通过获取所有数据,将其输出到文件中,然后将文件加载回 python 应用程序/脚本。

4

3 回答 3

3

您是否考虑过Celery或其他一些标准的 Queue/Broker 消息传递系统?django-celery 非常成熟,开发得很好,专为此类任务而设计。

Django -> Celery --> Worker Process (always running)
           ^     |-> Worker Process
           |     `-> Worker Process -,
           \______ Job Complete _____/

基本思想是您始终运行工作进程(在 1 个或多个服务器上)等待消息进入。(这些可以是腌制对象或 json 或任何您想要的)。这些进程空闲等待 Celery(它是 RabbitMQ 后端)向它们发送消息/作业。处理完消息/作业后,通知会通过代理返回并在 django 中调用回调,您可以在其中更新状态。

Celery 是一个基于分布式消息传递的任务队列/作业队列。它专注于实时操作,但也支持调度。

称为任务的执行单元在单个或多个工作服务器上同时执行。任务可以异步执行(在后台)或同步执行(等到准备好)。

于 2011-09-09T01:46:20.837 回答
2

对于这种消息传递,我喜欢使用真正的与语言无关的消息队列系统,该系统可以在未来的项目中反复使用。如果您可以处理在中间管理所有队列的消息队列代理,请查看 AMQP。或者,如果您不想要第 3 方代理,请查看 ZeroMQ。

在这两种情况下,您都可以使用子发布队列发送消息,如果需要,该队列可以处理每个队列的多个工作人员。这些消息可以是简单的文本字符串http://tnetstrings.org/,也可以是 JSON 对象,或者,如果您小心的话,您甚至可以将腌制的 Python 对象连同要执行的代码一起发送。我个人喜欢使用 JSON 对象(JSON 的一个子集)并将它们解压缩到 Python 字典中以便使用它们。

我在具有大约 20 个通信 Python 进程的系统中使用了 AMQP 和 ZeroMQ。它运行良好,如果你需要连接到非 Python 的东西,你会发现那里已经有一个 AMQP 模块和一个 ZeroMQ 库。

您的场景的一个有趣扩展是使用 Jython、CPython 和 IronPython 编写 3 种工作进程。这样您就可以利用 3rd 方 Java 和 .NET 模块以及像 lxml 这样的二进制 CPython 模块。将它与 Redis 之类的东西结合起来,这样进程就可以完全解耦,并且可以在必要时在多个服务器上运行。工作人员会将他们的结果放入 Redis,而不是用大消息与小消息交错来混淆消息队列系统。如有必要,工作人员可以发布包含 Redis 键的消息,以便另一个进程可以检索该值。

于 2011-09-09T02:03:31.740 回答
-1

酸洗很好,使用 cPickle 提高效率。但是,您不应该将其写入文件。而是使用其他一些 IPC 机制,例如避免磁盘开销的套接字或管道(即参见https://stackoverflow.com/search?q=python+named+pipes )。

于 2011-09-08T07:21:28.627 回答