Python进程间通信

时间:2011-02-07 17:02:51

标签: python rpc

我有一个Python应用程序(使用GUI,使用PyQt4),在多个实例中由用户生成。该应用程序用于执行一些长时间运行的任务(大约几个小时到几天),所以我愿意添加一个额外的“监控”应用程序,它将执行以下操作:

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

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

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

现在,我正在寻找实现这一目标的最佳方法。 实际上,没有任何东西可以用来管理RPC over unix套接字了吗?听起来有点奇怪,但我找不到任何合适的东西..

有什么建议吗?

注意:我不想反向(应用程序是单个监视服务器的客户端)以避免在监视应用程序崩溃时出现问题,并让我自由创建其他应用程序连接到这些套接字并发出请求。

注意:安全性不是问题,因为所有这些东西都在私有的,封闭的和防火墙的网络中运行:),而且,请求仅由受信任的用户在localhost上完成。

3 个答案:

答案 0 :(得分:2)

  

但这导致必须打开   几个不需要的插座听   只在localhost上,并且必须   创建某种端口分配   避免两个过程的机制   试图听同一个端口

不完全。首先,这就是大多数进程间通信通过套接字工作的方式。 TCP套接字或UNIX套接字。这基本上(不完全)是你在管理标准时所做的事情。

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

但是无论如何你都可以使用套接字连接。

答案 1 :(得分:2)

另一种方法是拥有某种作业控制系统,而不是让应用程序启动自己的进程,让它注册要执行任务的作业。然后,作业控制系统将监视启动的作业。作为奖励,通过这种设计,您可以在将来的某个时间点将工作分散到许多机器上。

答案 2 :(得分:2)

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

然后,我可以将TCP上的RPyC内容仅用于“主”控制应用程序和“管理器”应用程序之间的通信,该应用程序非常类似于机器上实例之间的“切换”。

一些ascii-art澄清:

+-------------------+                    
| 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]

如果有人有兴趣,请告诉我,我也会发布一些代码示例/更多细节。