2011-02-10 15 views
5

Abbiamo iniziato improvvisamente vedere "chiamata di sistema interrotta" sulle operazioni di coda in questo modo:chiamata di sistema interrotta con coda di elaborazione

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 

Si tratta di un Fedora 10/Python 2.5 macchina che recentemente ha avuto un aggiornamento di sicurezza. In precedenza il nostro software era in esecuzione da circa un anno senza incidenti, ora si blocca ogni giorno.

È corretto/necessario rilevare questa eccezione e riprovare l'operazione di coda?

Non abbiamo gestori di segnale che impostiamo, ma questa è un'app di Tkinter, forse ne imposta alcuni. È sicuro cancellare il gestore SIGINT, risolverebbe il problema? Grazie.

+1

Punto ovvio, ma un'improvvisa regressione dopo un aggiornamento suona come potrebbe essere un bug in un pacchetto su cui si sta facendo affidamento. Hai indagato su cosa è cambiato l'aggiornamento? –

+0

Buona idea, ho controllato yum.log e c'erano 580 pacchetti aggiornati. Nessuno dei Python sembrava un problema. Abbiamo macchine Fedora 12 e 13 che sembrano funzionare. Se il problema è specifico per "Fedora 10 + aggiornamenti", sono disposto a considerare l'aggiornamento alla nuova Fedora. – Philip

+0

Ora lo abbiamo visto su una macchina Fedora 14, Python 2.7. – Philip

risposta

7

Sulla base this thread su comp.lang.python e this reply da Dan Stromberg ho scritto una RetryQueue che è un rimpiazzo per la coda e che fa il lavoro per noi: Finalmente questo ha fissato

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) 
Problemi correlati