Jython(WLST)/Python通信

2024-04-28 05:01:44 发布

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

我想建立一个jython和python通信链接。我有一个django应用程序和python脚本,用于前端并执行系统管理/自动化任务。我使用jython实现weblogic9/10。我想做的是让它这样我就可以给jython系统一个请求。例如任务A带有参数A、b、c,完成后返回一条消息。在

我之所以这么做,是因为wlst或jython启动速度很慢,当我需要进行部署或检查一台或多台服务器的状态时(现在多达100台),这会让我很痛苦。那么,在保持jython/(wlst)系统运行并能够轻松地共享/发出请求的同时,将信息共享回主脚本或python类的最简单方法是什么?在

我的方法是使用pickle对象。通过获取所有数据,将其输出到一个文件,然后将该文件加载回python应用程序/脚本中。在


Tags: 文件django方法脚本应用程序消息参数链接
3条回答

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

对于这种消息传递,我喜欢使用真正的语言无关的消息队列系统,它可以在以后的项目中反复使用。如果您能够处理中间有一个消息队列代理来管理所有队列,那么可以看看AMQP。或者,如果您不需要第三方代理,那么可以看看ZeroMQ。在

在这两种情况下,您都可以使用sub-pub队列发送消息,如果需要,每个队列可以处理多个工人。消息可以是简单的文本字符串http://tnetstrings.org/,也可以是JSON对象,或者,如果小心的话,您甚至可以发送pickled Python对象以及要执行的代码。就我个人而言,我喜欢使用JSON对象(JSON的一个子集),并将它们解压到Python dict中以便使用它们。在

我在大约有20个正在通信的Python进程的系统中使用了AMQP和ZeroMQ。它工作得很好,如果您需要连接到非Python的东西,您会发现已经有一个AMQP模块和一个ZeroMQ库。在

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

您考虑过Celery或其他标准队列/代理消息传递系统吗?django芹菜是一种非常成熟和成熟的芹菜,是专门为这类任务而设计的。在

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

基本思想是,您总是运行工作进程(在一个或多个服务器上),等待消息传入。(这些可以是pickled对象或json或任何您想要的东西)。这些进程空闲等待celeri(它是RabbitMQ后端)向它们发出消息/作业。处理完消息/作业后,通知将通过代理返回,并在django中调用回调,在该回调中更新状态。在

Celery is a task queue/job queue based on distributed message passing. It is focused on real-time operation, but supports scheduling as well.

The execution units, called tasks, are executed concurrently on a single or more worker servers. Tasks can execute asynchronously (in the background) or synchronously (wait until ready).

相关问题 更多 >