用Python编写守护进程是一个好主意吗?

18

我需要编写一个守护程序,它会在后台不断运行并执行一些简单任务。逻辑非常简单,但必须稳定运行,并持续较长时间。

我认为使用C++编写这种应用程序是个不错的选择,但我也在考虑Python,因为在Python中更容易快速编写和测试代码。

我对Python的问题在于,我不确定它的运行环境在较长时间内的表现如何。它是否会因为某些GC怪癖而占用越来越多的内存?它是否会意外崩溃?我以前从未用Python编写过守护进程,如果您有经验,请分享一下。谢谢!


4
这可能会很方便:http://pypi.python.org/pypi/python-daemon/(我从未使用过)。 - Eduardo Ivanec
3个回答

14

我曾经为上一家公司使用Python编写过许多守护进程。简单来说,它能够正常工作。只要代码本身没有内存泄漏问题,我从未见过渐进式退化或内存占用过高的情况。请注意全局或类作用域中的任何内容,因为它们会一直存在,所以使用del比通常更加自由地使用它。其他方面,就像我说的那样,我个人没有遇到过任何问题。

如果你想知道,它们可以在 routine 重新启动之间运行数月 (通常是6个月) 而没有任何问题。


你用了哪个库来创建这些守护进程?是python-daemon还是daemonize? - Zaroth
@Zaroth 没有使用任何库,只是标准的双重分叉。 - Chris Eberle

4

是的,它可能会泄漏。是的,它可能会意外崩溃。任何东西都有可能。

我认为在手动内存管理的环境(例如C ++)中,您意外泄漏的可能性要比使用Python等语言更大。

至于意外崩溃,嗯,一个随意的Python代码块可能比一个随意的Java代码块更容易崩溃,因为后者受益于静态类型,可以在编译时捕获许多错误,而Python则采用鸭子类型和其他形式的灵活性。

实际上,对于您想要做的事情,Python听起来是一个完全合理的选择。看看像Twisted这样的东西,以获取一个良好的引擎来构建周围的内容,或者至少了解一下结构(您的问题听起来像某种学校作业,所以我不确定您有多少实现自由度)。


1
Twisted实际上更像是一个网络框架,OP从未说过这是一个网络守护进程。 - Chris Eberle
3
Python 是强类型和鸭子类型的。 - wim
1
@Chris:有道理,但当我想到Twisted时,我更多地考虑“基于事件”的方面,而不是网络方面,我觉得这对于任何类型的守护进程都是一个好模型。 - Kristian Glass
@wim:哎呀,是我错了。我总是把我的打字描述搞错,谢谢你指出来。现在我要试着记住我想说的话! - Kristian Glass
@wim 尽管 Python 具有强类型,但其函数参数不限制类型,并且将接受任何类型的变量作为任何参数。这是长时间运行的进程经常遇到的问题,工作得很好,直到某个人意外地将错误的类型传递给函数并且未捕获的异常终止整个进程。您必须非常小心地实现适当的异常捕获和日志记录,以确保程序具有非中断但非沉默的行为。这通常不是短暂脚本的问题。 - Nisan.H

1

我用C/C++和Perl写了很多东西,它们在LINUX操作系统启动时启动,使用rc.d进行启动。

此外,我还编写了一些Java和Python脚本,以与上述相同的方式启动它们,但我需要一个小的shell脚本(.sh文件)来启动它们,我使用了rc.5。

让我告诉你,你对它们的运行环境的担忧是完全合理的,你必须小心选择运行级别... (只能从rc.2到rc.5,因为rc.1和rc.6是为系统保留的)。

如果运行级别太低,Python运行时可能在您启动程序时还没有准备好,这可能会导致失败。例如:在LAMP服务器中,MySQL和Apache在rc.3中启动,此时网络已经可用。

我认为你最好的选择是用Python编写脚本,并使用.sh文件从rc.5启动它。

祝你好运!


RC.x级别是什么? - Finglas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接