2011-02-10 8 views
5

repente Comenzamos ver "llamada al sistema interrumpida" en las operaciones de cola de la siguiente manera:interrumpido llamada al sistema con cola de procesamiento

Exception in thread Thread-2: 
Traceback (most recent call last): 
[ . . . ] 
    result = self.pager.results.get(True, self.WAIT_SECONDS) 
File "/usr/lib/python2.5/site-packages/processing-0.52-py2.5-linux-x86_64.egg/processing/queue.py", line 128, in get 
    if not self._poll(block and (deadline-time.time()) or 0.0): 
IOError: [Errno 4] Interrupted system call 

Se trata de una máquina de 2,5 Fedora 10/Python que recientemente tuvo una actualización de seguridad. Antes de eso, nuestro software se había ejecutado durante aproximadamente un año sin incidentes, ahora se bloquea a diario.

¿Es correcto/necesario detectar esta excepción y volver a intentar la operación Queue?

No tenemos controladores de señal que establezcamos, pero esta es una aplicación de Tkinter tal vez establece algunos. ¿Es seguro borrar el controlador SIGINT? ¿Eso resolvería el problema? Gracias.

+1

Obvio, pero una regresión repentina después de una actualización parece que podría ser un error en un paquete en el que se basa. ¿Has investigado qué cambió la actualización? –

+0

Buena idea, revisé yum.log y había 580 paquetes actualizados. Ninguno de los Python parecía un problema. Tenemos las máquinas Fedora 12 y 13 que parecen estar funcionando. Si el problema es específico de "Fedora 10 + actualizaciones", estoy dispuesto a considerar la actualización a Fedora. – Philip

+0

Ahora hemos visto esto en una máquina Fedora 14, Python 2.7. – Philip

Respuesta

7

Basado en this thread en comp.lang.python y this reply desde Dan Stromberg me escribió una RetryQueue que es una gota en el reemplazo de cola y el que hace el trabajo por nosotros:

from multiprocessing.queues import Queue 
import errno 

def retry_on_eintr(function, *args, **kw): 
    while True: 
     try: 
      return function(*args, **kw) 
     except IOError, e:    
      if e.errno == errno.EINTR: 
       continue 
      else: 
       raise  

class RetryQueue(Queue): 
    """Queue which will retry if interrupted with EINTR.""" 
    def get(self, block=True, timeout=None): 
     return retry_on_eintr(Queue.get, self, block, timeout) 
Cuestiones relacionadas