2011-02-10 95 views
5

我們突然開始看到「被中斷的系統調用」的隊列操作是這樣的:中斷系統調用處理隊列

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 

這是一個Fedora 10/Python 2.5的機器,最近有一個安全更新。在此之前,我們的軟件已經運行了大約一年,現在每天都在崩潰。

是否正確/有必要捕獲此異常並重試Queue操作?

我們沒有任何我們設置的信號處理程序,但這是一個Tkinter應用程序,也許它設置了一些。清除SIGINT處理程序是否安全?是否可以解決問題?謝謝。

+1

很明顯的一點,但更新後的突然迴歸聽起來像它可能是你依賴的包中的錯誤。你有沒有調查過更新的變化? – 2011-02-10 01:12:33

回答

7

基於this thread在comp.lang.python和this reply從丹·斯特龍伯格我寫了一個RetryQueue這是一個簡易替換隊列和爲我們做的工作:

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)