2011-02-10 12 views
5

Nagle zaczął widzieć „Przerwane wywołanie systemowe” na działalność kolejek takiego:przerwane połączenia z systemem przetwarzania kolejki

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 

To Fedora 10/Python 2.5 maszyna, która niedawno aktualizacji zabezpieczeń. Wcześniej nasze oprogramowanie działało przez około rok bez incydentów, teraz codziennie się zawiesza.

Czy jest prawidłowe/konieczne przechwycenie tego wyjątku i ponowienie operacji Kolejka?

Nie mamy żadnych programów obsługi sygnału, które ustawiamy, ale jest to aplikacja Tkinter, może ustawi niektóre. Czy bezpieczne jest wyczyszczenie programu obsługi SIGINT, czy to rozwiąże problem? Dzięki.

+1

Oczywisty punkt, ale nagła regresja po aktualizacji brzmi, jakby to był błąd w pakiecie, na którym polegasz. Czy sprawdziłeś, co zmieniła aktualizacja? –

+0

Dobry pomysł, sprawdziłem yum.log i było 580 zaktualizowanych pakietów. Żadna z wersji Pythona nie wydawała się problemem. Mamy maszyny Fedory 12 i 13, które wydają się działać. Jeśli problem dotyczy "Aktualizacji Fedory 10 +", rozważę aktualizację do najnowszej Fedory. – Philip

+0

Widzieliśmy to już na maszynie Fedora 14, Python 2.7. – Philip

Odpowiedz

7

podstawie this thread na comp.lang.python i this reply od Dan Stromberg Napisałem RetryQueue który jest zamiennikiem drop-in do kolejki i który robi to zadanie dla nas:

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) 
Powiązane problemy