python-daemon 和多处理库之间的区别

Posted

技术标签:

【中文标题】python-daemon 和多处理库之间的区别【英文标题】:Difference between python-daemon and multiprocessing libraries 【发布时间】:2014-07-08 12:25:07 【问题描述】:

我需要从运行 xmlrpc 服务器的 python django 模块运行守护进程。主进程将托管一个 xmlrpc 客户端。我对在 python 中创建、启动、停止和终止守护进程有点困惑。我见过两个库,一个是标准的 python 多处理库,另一个是 python-daemon (https://pypi.python.org/pypi/python-daemon/1.6),但不太了解在我的情况下哪个是有效的。另外,何时以及如何为我的守护进程处理 SIGTERM?有人可以帮我理解这些吗?

【问题讨论】:

【参考方案1】:

multiprocessing 模块被设计为线程模块的直接替代品。它旨在用于您通常使用线程执行的相同类型的任务;通过针对多个内核运行、后台轮询以及您希望与其他任务同时运行的任何其他任务来加速执行。它不是为启动独立的守护进程而设计的,所以我认为它不适合您的用例。

python-daemon 库旨在“守护”当前正在运行的 Python 进程。我认为您想要的是使用主进程(xmlrpc 客户端)中的subprocess 库来启动您的守护进程(xmlrpc 服务器),使用subprocess.Popen。然后,在守护进程内部,您可以使用python-daemon 库成为守护进程。

所以在主进程中,是这样的:

subprocess.Popen([my_daemon.py, "-o", "some_option"])

my_daemon.py:

import daemon
...
def main():
   # Do normal startup stuff

if __name__ == "__main__":
    with daemon.DaemonContext(): # This makes the process a daemon
        main()

【讨论】:

谢谢,但我尝试了不同的方法。我从主程序中分叉了一个子程序,并在子程序中创建了一个 xmlrpc 服务器,并在主进程中创建了一个 xmlrpcclient,如第 20.23.2 节中的https://docs.python.org/2/library/xmlrpclib.html 所示,但是服务器公开的远程功能写在我导入的另一个文件中。作为一个独立的程序,这个设置工作正常,当我在 django 中做同样的事情时,它给出了 Broken PIPE(错误 32)。你能告诉我django有什么问题吗?

以上是关于python-daemon 和多处理库之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

python-daemon 中的信号处理

python-daemon 阻止对 ctypes 链接的 C 用户库的 ioctl 调用

异步编程和多线程有啥区别?

普通 python 代码和多处理中的相同代码之间的时间差是多少?

SIMD和多线程之间的区别[关闭]

多线程和多进程的区别