2011-02-10 4 views
5

Nous soudainement commencé à voir « appel système Interrupted » sur les opérations de la file d'attente comme ceci:appel système interrompu par la file d'attente de traitement

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 

Ceci est une machine Fedora 10/Python 2.5 qui avait récemment une mise à jour de sécurité. Avant cela, notre logiciel fonctionnait depuis environ un an sans incident, maintenant il plante tous les jours.

Est-il correct/nécessaire d'intercepter cette exception et de réessayer l'opération de file d'attente?

Nous n'avons pas de gestionnaire de signal que nous définissons, mais c'est une application Tkinter peut-être qu'il en définit. Est-il sûr d'effacer le gestionnaire SIGINT, cela résoudrait-il le problème? Merci.

+1

évident, mais une régression soudaine après une mise à jour sonne comme il pourrait être un bug dans un paquet que vous comptez sur. Avez-vous étudié ce que la mise à jour a changé? –

+0

Bonne idée, j'ai vérifié yum.log et il y avait 580 paquets mis à jour. Aucun des Python ne semblait être un problème. Nous avons des machines Fedora 12 et 13 qui semblent fonctionner. Si le problème est spécifique aux "mises à jour de Fedora 10 +", je suis prêt à envisager la mise à jour de Fedora. – Philip

+0

Nous l'avons vu sur une machine Fedora 14, Python 2.7. – Philip

Répondre

7

Basé sur this thread sur comp.lang.python et this reply de Dan Stromberg j'ai écrit un RetryQueue qui est une fonction de remplacement dans la file d'attente pour et qui fait le travail pour nous:

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) 
Questions connexes