Python 线程和守护进程

1 投票
2 回答
1040 浏览
提问于 2025-04-16 13:30

我正在用Python处理守护进程,参考了Sander的方法

到目前为止,一切都运行得不错,但我需要做一些改动,这让我很困惑。

问题是:

Sander的守护进程每次你请求它时,都会创建一个新的对象实例。举个例子:

[prompt]> python my_daemon.py start
[prompt]> python my_daemon.py check_whatever (new instance of my_daemon.py is created, but it looks for pid and finally gets the first one.)

然后,通过查找用于创建旧实例的进程ID(pid),你可以访问并管理它。

现在的情况是:这个守护进程会生成两个线程,这些线程在守护进程执行启动命令后继续工作,并且准备接受另一个命令(记住,会创建一个新的实例)。我想在另一个命令中访问这些线程,但我还没找到方法(如果有的话)。
根据我的研究,通过pid你只能终止或检查守护进程,但我不知道是否可以获取由该实例创建的对象(也就是线程)。

待解决的问题

-如果我能通过pid恢复进程,我是否也能访问它的对象?

-我是否需要考虑将这些线程转换为子进程,以便在主线程完成(或仍在等待)后保持它们的存活?

2 个回答

0

我不太确定是否真的需要新建一个进程,但这样做可能会比小心翼翼地处理全局解释器锁(GIL)要简单得多。这主要取决于守护线程执行的任务大小,以及这些任务是否是纯Python代码,或者是否可以通过调用外部库来释放GIL。

至于通过进程ID(pid)访问,我不太确定这是否可行。在Windows系统下,线程是没有自己的pid的,所以这方面肯定是不行的。对我来说,保持与新线程的管道连接会简单得多。

其实这里有太多架构上的决策,没法简单地回答这个问题。如果你已经做出了这些决策,可以在你的提问中添加更多信息,我会尽量给出更有针对性的回答。

0

在对代码内容进行“清理”后,把活跃的代码行减少到最少,我发现线程就像勇士一样静止不动。处理文件时遇到了一些问题,我觉得这些问题可能和守护进程的行为有关(因为它把文件描述符设置为null)。

目前,我觉得还不错,因为我可以使用一些简单的协议来改变这些线程的运行行为(比如一个简单的配置文件)。

撰写回答