我有一个Python应用程序(使用GUI,使用PyQt4),它由用户在几个实例中生成。该应用程序用于执行一些长时间运行的任务(大约几个小时到几天),因此我愿意添加一个额外的“监视”应用程序,它将执行以下操作:
适合这项工作的一种方法是RPyC,这是唯一的问题,它似乎只在TCP套接字上工作,就像我找到的大多数RPC库一样。但是,这导致不得不打开几个只在localhost上侦听的不需要的套接字,并且必须创建某种端口分配机制,以避免两个进程试图侦听同一个端口。然后,监视器需要一个端口列表来写入某个位置,或者找到侦听TCP端口的进程,并试图找出它们是正确的应用程序的实例还是ot。听起来糟透了。
管理我目前所能想到的最好的互通方式是在‘/var/run/myapp/myapp-..sock’中使用一些unix套接字,然后创建一个模块,该模块公开一些方法,比如listMyApps()和getMyApp(pid),返回第一个pids列表,第二个对象可用于与该应用程序进行通信。
现在,我正在寻找实现这一目标的最佳方法。实际上,还没有在unix套接字上管理RPC的任何工作吗?听起来有点奇怪,但我找不到适合我的东西。
有什么建议吗?
注意:我不想逆转(应用程序是单个监视服务器的客户端),以避免在监视应用程序崩溃时出现问题,并允许我自由地创建连接到这些套接字和发出请求的其他应用程序。
注意:安全性不是一个问题,因为所有这些东西都是在私有、封闭和防火墙网络中运行的:),另外,请求只能由受信任的用户在本地主机上完成。
发布于 2011-02-17 12:17:15
我想我通过使用dbus-python找到了一个解决方案。我能够将它集成到Qt4主循环中,尽管在网站上他们说只支持glib (我猜该页面没有更新)。我刚刚做了一个qick测试,它似乎工作得很好(我只是在一个名为com.example.myapp.<pid>的总线上设计了一些虚拟函数,列出了实例,并从外部客户端连接)。
然后,我只能在“主控”控制应用程序和“管理器”应用程序之间进行通信,这两种应用程序在计算机上的实例之间的“切换”非常类似。
一些艺术上的澄清:
+-------------------+
| 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]如果有人感兴趣,请告诉我,我也会发布一些代码示例/更多细节。
发布于 2011-02-07 17:32:26
但是,这导致不得不打开几个只在localhost上侦听的不需要的套接字,并且必须创建某种端口分配机制,以避免两个进程试图侦听同一个端口。
不完全是。首先,这是大多数进程间通信通过套接字工作的方式。TCP套接字或UNIX套接字。这实际上是(不完全)你在管道标准的时候所做的事情。
你也可以使用操作系统信号。尽管您必须记住,只有每个进程的主线程才能进行信号处理,所以您必须小心不要阻止它。
但是不管你怎么做,几乎都不能使用套接字连接。
发布于 2011-02-07 18:24:19
另一种方法是拥有某种类型的作业控制系统,而不是让应用程序启动自己的进程,而是让应用程序注册要启动的执行任务的作业。然后,作业控制系统将监视已启动的作业。作为一种奖励,有了这个设计,你可以在将来的某个时候在许多机器上展开工作。
https://stackoverflow.com/questions/4924083
复制相似问题