2011-06-20 24 views
6

Escribí un programa de prueba, que tiene dos procesos. El proceso padre obtiene datos de una cola y el niño ingresa datos en ella. Hay un controlador de señal que le dice al programa que salga. Sin embargo, no sale a veces cuando envío la señal SIGTERM al pid (proceso hijo) que imprimí, y parece estar teniendo un punto muerto.¿Por qué este programa python a veces no puede salir?

import os 
import sys 
import multiprocessing 
import time 
import signal 

bStop = False 
def worker(que): 
    signal.signal(signal.SIGTERM,sighandler) 
    print 'worker:',os.getpid() 
    for i in range(100000000): 
     que.put(i) 

    print 'STOP' 

def sighandler(num,frame): 
    print 'catch signal' 
    q.put('STOP') 
    sys.exit(0) 
q = multiprocessing.Queue(100) 
p = multiprocessing.Process(target=worker,args=(q,)) 
p.start() 

for item in iter(q.get,'STOP'): 
    print 'get',item 
    pass 
print 'main stop' 
p.join() 
+0

Wow ... con 100,000,000 no estabas bromeando sobre ese rango, ¿o sí? – cwallenpoole

+0

@cwallenpoole Solo quiero que funcione por un largo tiempo .... – renenglish

+0

Bueno, ha estado ejecutándose en segundo plano durante 20 minutos y no ha llegado a 50,000,000 aún – cwallenpoole

Respuesta

1

A menos que esté ejecutando python 3, debe utilizar xrange en lugar de range para un bucle tan grande. Python tiende a ahogarse una vez que excede un cierto tamaño de lista, por lo que realmente necesita moverse a los generadores en ese punto.

Ese podría ser el problema que está viendo ahora mismo.

Cuestiones relacionadas