Estoy recibiendo el siguiente error cuando se utiliza el módulo de multiprocesamiento dentro de un proceso de demonio de pitón (Python usando -daemon):error durante el uso de módulo de multiprocesamiento en un demonio de pitón
Traceback (most recent call last): File "/usr/local/lib/python2.6/atexit.py", line 24, in _run_exitfuncs func(*targs, **kargs) File "/usr/local/lib/python2.6/multiprocessing/util.py", line 262, in _exit_function for p in active_children(): File "/usr/local/lib/python2.6/multiprocessing/process.py", line 43, in active_children _cleanup() File "/usr/local/lib/python2.6/multiprocessing/process.py", line 53, in _cleanup if p._popen.poll() is not None: File "/usr/local/lib/python2.6/multiprocessing/forking.py", line 106, in poll pid, sts = os.waitpid(self.pid, flag) OSError: [Errno 10] No child processes
El proceso de demonio (padre) engendra una serie de procesos (hijos) y luego sondea periódicamente los procesos para ver si se han completado. Si el padre detecta que uno de los procesos se ha completado, intenta reiniciar ese proceso. Es en este punto que se plantea la excepción anterior. Parece que una vez que se completa uno de los procesos, cualquier operación que involucre el módulo de multiprocesamiento generará esta excepción. Si ejecuto el código idéntico en un script python no daemon, se ejecuta sin errores de ningún tipo.
EDIT:
Script de ejemplo
from daemon import runner
class DaemonApp(object):
def __init__(self, pidfile_path, run):
self.pidfile_path = pidfile_path
self.run = run
self.stdin_path = '/dev/null'
self.stdout_path = '/dev/tty'
self.stderr_path = '/dev/tty'
def run():
import multiprocessing as processing
import time
import os
import sys
import signal
def func():
print 'pid: ', os.getpid()
for i in range(5):
print i
time.sleep(1)
process = processing.Process(target=func)
process.start()
while True:
print 'checking process'
if not process.is_alive():
print 'process dead'
process = processing.Process(target=func)
process.start()
time.sleep(1)
# uncomment to run as daemon
app = DaemonApp('/root/bugtest.pid', run)
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()
#uncomment to run as regular script
#run()
Ejecutar el script con el tronco de python 2.7 produce el mismo resultado. Agregué el script de prueba que estoy usando a la publicación original. ¿Estoy haciendo algo descaradamente mal? –
No estoy seguro, tendría que cargar una prueba que use python-daemon para verificarlo. Nada salta a mí en este momento. – jnoller