2011-02-07 92 views
3

我有一个Python应用程序(带GUI,使用PyQt4),由用户在几个实例中产生。该应用程序是用来执行一些长时间运行的任务(约几个小时到几天),所以我愿意加上一个额外的“监控”应用程序,将做这样的事情:Python进程间通信

  • 找出所有正在运行的进程其他应用程序的
  • 获得运行中的操作的状态(完成工作,百分比,错误消息,...)
  • 最终发送一些命令到应用程序告诉他们暂停,恢复,终止,...

一种适合这项工作的方法是RPyC,唯一的问题,它似乎只能在TCP套接字上工作,就像我找到的大多数RPC库一样。但是这导致必须打开几个不需要的套接字,这些套接字只在本地主机上侦听,并且必须创建某种端口分配机制以避免两个进程试图在同一个端口上侦听。然后监视器需要一个端口列表来写入某个地方,或者去查找在TCP端口上侦听的进程,并试图找出它们是否是正确的应用程序或ot实例。听起来像一团糟。

管理互通的最好方法我现在想到的可能是在'/var/run/myapp/myapp-.sock'中有一些unix套接字,然后创建一个模块所有肮脏的东西暴露了一些方法,如listMyApps()getMyApp(pid)返回第一个pid列表,第二个可用于与该应用程序通信的对象。

现在,我正在寻找最好的方法来实现这个目标。 真的,没有任何东西可以通过unix套接字管理RPC吗?听起来有点奇怪,但我无法找到任何可以装配的东西。

有什么建议吗?

注:我不想扭转的东西(应用程序是一个单一的监控服务器的客户端),以避免问题的监测应用程序崩溃的情况下,并让我自由地创建连接到这些插座其他应用程序并提出请求。

注:安全不是一个问题,因为所有这些东西是在私人运行,关闭防火墙和网络:),再加上,请求由只有受信任的用户在本地主机上完成的。

回答

2

我想我找到了一个soultion使用dbus-python。我能够将它与Qt4主循环集成在一起,尽管在网站上他们说只支持glib(我猜这个页面没有更新)。我只是做了一个qick测试,似乎工作得很好(我只在一条名为com.example.myapp.<pid>的总线上放置了一些虚拟函数,并列出了实例并从外部客户端连接)。

然后,我可以使用RPyC东西通过TCP只为“主”控制应用和“经理”的应用程序,行为相当像一台机器上的实例之间的“开关”之间的通信。

一些ASCII艺术澄清:

+-------------------+      
| MASTER APP  |     +--------------------+ 
| on my workstation |------ RPyC --------| Server#0 Manager | 
+-------------------+     +--------------------+ 
     |          | | | 
    RPyC          | | '-- dbus ---[INSTANCE #0] 
     |          | '--- dbus ---[INSTANCE #1] 
    +--------------------+     '---- dbus ---[INSTANCE #2] 
    | Server#1 Manager | 
    +--------------------+ 
     | | | 
     | | '-- dbus ---[INSTANCE #0] 
     | '--- dbus ---[INSTANCE #1] 
     '---- dbus ---[INSTANCE #2] 

如果有人有兴趣,只是让我知道,我会张贴一些代码示例/详细信息太..

2

但是这会导致不必打开 一些不必要的插座只监听localhost ,并且具有 创建某种端口分配 机制,以避免两个进程 尝试收听同一端口上

不完全。首先,这就是大多数进程间通信通过套接字进行工作的方式。无论是TCP套接字还是UNIX套接字。这基本上(不完全)是你在标准化之类的时候所做的。

您也可以使用操作系统信号。虽然你必须记住每个进程只有主线程可以进行信号处理,所以你必须小心不要阻止它。

但是你做的任何方式有利用周围套接字连接几乎没有得到。

+0

我的意思是什么,我不不想在每个进程的不同端口上设置监听套接字..我想到了信号,但是它们绝对不足以满足我需要,因为我需要按顺序在各种应用函数上运行方法以查询其状态(不仅完成百分比,但更复杂的细节),或执行一堆操作“就好像用户点击XYZ用户界面按钮”一样.. – redShadow 2011-02-07 22:47:57

2

另一种方式去是有某种作业控制体系,而不是让应用程序启动自己的过程,有其注册的工作岗位要启动的是做任务。然后,作业控制系统将监视开始的作业。作为奖励,通过这种设计,您可以在未来的某个时间在多台机器上进行工作。

+0

是的,这个是一个很好的答案。看看python的多处理库。 – Falmarri 2011-02-07 19:31:50

+0

你对“职位控制系统”有什么建议?旧版本的应用程序只是产生了主应用程序的几个线程(易于用Python处理),并且能够与它们进行通信,但是我放弃了这种方式,因为如果出现错误,分离的进程更方便(操作失败严重或卡住,应用程序本身存在错误,...),甚至有时甚至用STOP/CONT暂停/恢复进程。 – redShadow 2011-02-07 22:52:15