【问题标题】:Python threads and daemonsPython 线程和守护进程
【发布时间】:2011-07-13 13:53:40
【问题描述】:

我正在使用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,您可以访问它并使用它进行管理。

情况是:这个守护进程产生了两个线程,它们在守护进程执行了启动命令并准备好接纳另一个线程之后继续工作(记住,一个新的实例被创建了)。我想在另一个命令中访问这个线程,但是我没有找到方法(如果有的话)。
据我研究,使用 pid 你只能杀死或检查守护进程,但不知道是否可以获取该实例创建的对象(ergo,线程)。

开放式问题

-如果我可以从它的 pid 中恢复进程,我还可以访问它的对象吗?

-在其主线程完成(或仍在等待)之后,我是否必须考虑将此线程转换为子进程以使它们保持活动状态?

【问题讨论】:

    标签: python pthreads daemon


    【解决方案1】:

    我不确定是否需要一个新进程本身,但实施起来可能比必须仔细管理 GIL 的方式要干净得多,具体取决于守护程序线程的任务大小执行,以及它们是纯python,还是可以通过调用外部库释放GIL。

    至于通过pid访问,我不确定这是否可能,这绝对不是windows下的线程,因为它们没有自己的pid;对我来说,让管道对你的新线程保持开放似乎要简单得多。

    确实有太多架构决策无法清楚地回答这个问题,但如果您已经做出这些决定,请随时为您的问题添加更多信息,我会尝试给出更明智的答案。

    【讨论】:

    • 我还没有选择任何决定。我只是发现使用在 start 命令中产生线程的进程,我无法在其余命令中访问它们。
    【解决方案2】:

    在对代码内容进行“清除”后,将活动行减少到最少,我意识到线程静止不动(作为优秀的战士)。当我处理我认为可以在守护程序本身的行为中建立的文件时会出现一些问题(因为它将文件描述符设置为空)。

    现在,我认为自己很高兴,因为我可以使用一些虚拟协议来改变这些线程的运行行为(例如虚拟配置文件)。

    【讨论】:

    • 多么好奇,无法处理守护进程的 run 方法中的文件(我自己的类中被覆盖的方法)。
    • [irony]这句话 os.chdir("/") 对你说了什么吗?[/irony] 我错过了这个变化。所有文件都被放入 int "/"。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多