与正在运行的Python守护程序通信

2024-05-31 10:23:14 发布

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

我编写了一个作为守护进程运行的小Python应用程序。它利用线程和队列。

我正在寻找更改此应用程序的一般方法,以便在它运行时与之通信。大多数情况下,我希望能够监测它的健康状况。

简而言之,我希望能够做这样的事情:

python application.py start  # launches the daemon

稍后,我想一起做一些事情,比如:

python application.py check_queue_size  # return info from the daemonized process

为了清楚起见,我在实现Django启发的语法方面没有任何问题。我不知道如何将信号发送到守护进程(start),或者如何编写守护进程来处理和响应这些信号。

就像我上面说的,我正在寻找一般的方法。我现在唯一能看到的是告诉守护进程不断地将可能需要的所有内容记录到一个文件中,但是我希望有一个不那么混乱的方法来解决这个问题。

更新:哇,有很多很棒的答案。非常感谢。我想我会看看Pyro和web.py/Werkzeug两种方法,因为Twisted比我现在想说的要多一些。下一个概念上的挑战,我想,是如何在不挂断线程的情况下与我的工作线程进行对话。

再次感谢。


Tags: the方法py应用程序利用信号application队列
3条回答

还有一种方法:使用Pyro(Python远程处理对象)。

Pyro基本上允许您将Python对象实例发布为可以远程调用的服务。我使用Pyro的目的正是你所描述的,我发现它工作得很好。

默认情况下,Pyro服务器守护进程接受来自任何地方的连接。要限制此限制,请使用连接验证器(请参阅文档),或向host='127.0.0.1'构造函数提供Daemon以仅侦听本地连接。

来自Pyro文档的示例代码:

服务器

import Pyro.core

class JokeGen(Pyro.core.ObjBase):
        def __init__(self):
                Pyro.core.ObjBase.__init__(self)
        def joke(self, name):
                return "Sorry "+name+", I don't know any jokes."

Pyro.core.initServer()
daemon=Pyro.core.Daemon()
uri=daemon.connect(JokeGen(),"jokegen")

print "The daemon runs on port:",daemon.port
print "The object's uri is:",uri

daemon.requestLoop()

客户

import Pyro.core

# you have to change the URI below to match your own host/port.
jokes = Pyro.core.getProxyForURI("PYROLOC://localhost:7766/jokegen")

print jokes.joke("Irmen")

另一个类似的项目是RPyC。我没试过RPyC。

使用werkzeug并使守护进程包含一个基于HTTP的WSGI服务器。

您的守护进程有一个小的WSGI应用程序集合,可以用状态信息进行响应。

您的客户机只需使用urllib2向localhost:somePort发出POST或GET请求。您的客户机和服务器必须在端口号(和URL)上达成一致。

这是非常简单的实现和非常可扩展的。添加新命令是一个简单的练习。

注意,守护进程不必用HTML响应(不过,这通常很简单)。我们的守护进程使用JSON编码的状态对象响应WSGI请求。

让它运行http服务器怎么样?

运行一个简单的web服务器来管理 服务器只需要使用web.py的几行代码

您还可以考虑创建一个unix管道。

相关问题 更多 >