2012-03-19 11 views
18

Tengo que escribir un programa daemon que se ejecuta constantemente en segundo plano y realiza algunas tareas simples. La lógica no es complicada en absoluto, sin embargo, tiene que funcionar durante largos períodos de tiempo y ser estable.¿Es buena idea escribir un daemon en Python?

Creo que C++ sería una buena opción para escribir este tipo de aplicación, sin embargo, también estoy considerando Python, ya que es más fácil escribir y probar algo rápidamente en él.

El problema que tengo con Python es que no estoy seguro de cómo se comportará su entorno de ejecución durante largos períodos de tiempo. ¿Puede consumir más y más memoria debido a algunos caprichos de GC? Puede fallar inesperadamente? Nunca antes había escrito daemons en Python, por lo que si alguien lo hizo, comparta su experiencia. ¡Gracias!

+4

Esto puede ser útil: http://pypi.python.org/pypi/python-daemon/ (nunca lo usó). –

Respuesta

14

He escrito varios daemons en Python para mi última empresa. La respuesta corta es que funciona bien. Siempre que el código en sí no tenga una gran bomba de memoria, nunca he visto una degradación gradual o pérdida de memoria. Sea consciente de cualquier cosa en los ámbitos globales o de clase, porque seguirán vivos, así que use del más liberalmente que lo haría normalmente. De lo contrario, como dije, no hay problemas que pueda informar personalmente.

Y en caso de que se lo pregunte, funcionaron durante meses y meses (digamos 6 meses generalmente) entre reinicios rutinarios sin problemas.

+0

¿qué biblioteca usaste para estos daemons? ¿python-daemon? daemonize? – Zaroth

+0

@Zaroth no hay biblioteca, solo una doble horquilla estándar. –

4

Sí, puede tener fugas. Sí, puede colapsar inesperadamente. Cualquier cosa puede

Diría que es mucho más probable que acabe filtrándose accidentalmente en un entorno con gestión de memoria manual (por ejemplo, C++) que con algo parecido a Python.

En cuanto a bloquearse inesperadamente, bueno, es probable que un bloque arbitrario de Python sea más propenso a bloquearse inesperadamente que un bloque arbitrario de Java, porque este último se beneficia de static typing donde puede atrapar una carga completa de errores en tiempo de compilación , que Python con su duck typing y otras formas de flexibilidad.

Siendo realistas, Python suena como una opción perfectamente razonable para lo que quiere hacer. Eche un vistazo a algo como Twisted para obtener un motor decente para construir cosas, o al menos una idea de estructura (su pregunta suena como algún tipo de tarea escolar, así que no estoy seguro de cuánta libertad de implementación obtiene)

+1

Twisted es realmente más un framework de red, el OP nunca dijo que se tratara de un daemon de red. –

+3

Python está fuertemente tipado y pato mecanografiado – wim

+1

@Chris: Punto justo, aunque cuando pienso en Twisted pienso más en el "basado en eventos" que en la red, que siento que es un buen modelo para cualquier clase de daemon –

1

He escrito muchas cosas en C/C++ y Perl que se inician cuando se usa un sistema operativo LINUX botas, lanzándolos usando el rc.d.

También he escrito un par de scripts de Java y Python que se inician de la misma manera que he mencionado anteriormente, pero necesitaba un pequeño script de shell (archivo .sh) para ejecutarlos y usé rc.5 .

Déjeme decirle que sus preocupaciones sobre sus entornos de tiempo de ejecución son completamente válidas, tendrá que tener cuidado sobre qué nivel de ejecución usará ... (solo de rc.2 a rc.5, porque rc.1 y rc.6 son para el Sistema).

Si el nivel de ejecución es demasiado bajo, es posible que el tiempo de ejecución de python no esté activo en el momento de iniciar el programa y podría fallar. Por ejemplo: en un servidor LAMP MySQL y Apache se inician en rc.3 donde la red ya está disponible.

Creo que lo mejor es hacer su script en python y ejecutarlo usando un archivo .sh desde rc.5.

¡Buena suerte!

+0

¿Qué son exactamente los niveles RC.x? – Finglas

+1

Esto podría ser útil: http://www.networkclue.com/os/Linux/run-levels.aspx –

+0

@Finglas Puedes preguntar eso en http://unix.stackexchange.com –

Cuestiones relacionadas