sto ottenendo il seguente errore quando si utilizza il modulo di multiprocessing all'interno di un processo python daemon (usando python-daemon):Errore durante l'utilizzo del modulo multiprocessing in un demone pitone
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
Il processo demone (genitore) genera un numero di processi (bambini) e quindi periodicamente esegue il polling dei processi per vedere se sono stati completati. Se il genitore rileva che uno dei processi è stato completato, tenta quindi di riavviare quel processo. È a questo punto che viene sollevata l'eccezione di cui sopra. Sembra che una volta completato uno dei processi, qualsiasi operazione che coinvolge il modulo multiprocessing genererà questa eccezione. Se eseguo il codice identico in uno script Python non daemon, viene eseguito senza errori di sorta.
EDIT:
Script di esempio
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()
L'esecuzione dello script con trunk python 2.7 produce lo stesso risultato. Ho aggiunto lo script di test che sto utilizzando al post originale. Sto facendo qualcosa di sfacciato? –
Non sono sicuro, dovrei caricare un test che usa python-daemon per verificarlo. Niente mi salta in questo momento. – jnoller