我正在使用Sander's recipy在python中使用守护进程。
直到现在已经运行良好,但我必须介绍一些正在钻脑的变化。 事实是:
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.)
然后,查找用于创建旧实例的pid,您可以访问它并使用它进行管理。
情况是:这个守护进程产生两个线程,它们在守护进程执行了start命令后继续工作,并准备接受另一个(记住,创建了一个新实例)。我想在另一个命令中访问这个线程但是,我没有找到方法(如果有的话)。
据我所研究,使用pid你只能杀死或检查守护进程,但不知道是否有可能获得该实例创建的对象(ergo,线程)。
打开问题:
- 如果我可以从它的pid中恢复进程,我还可以访问它的对象吗?
- 我必须考虑将这个线程转换为子进程,以便在它的主线程完成(或者还在等待)之后保持它们的存活吗?
答案 0 :(得分:0)
我不确定是否需要一个新的进程本身,但实现起来可能要比在GIL周围仔细管理你的方式要干净得多,具体取决于守护进程线程的任务大小执行,以及它们是纯python还是可以通过调用外部库来释放GIL。
至于pid访问,我不确定这是否可能,它绝对不适用于windows下的线程,因为它们没有自己的pid;对我来说,保持管道对你的新线程开放似乎要简单得多。
确实有太多的架构决策可以干净利落地回答这个问题,但如果您已经做出这些决定,请随时在您的问题中添加更多信息,我会尝试提供更明智的答案。
答案 1 :(得分:0)
在对代码内容进行“清除”之后,将活动线路减少到最小,我意识到线程停滞不前(作为优秀的战士)。当我处理我认为可以在守护进程本身的行为中建立的文件时存在一些问题(因为它将文件描述符设置为null)。
目前,我认为自己很开心,因为我可以使用一些伪协议来改变这些线程的运行行为(例如虚拟配置文件)。