2011-02-10 27 views
5

Chúng tôi đột nhiên bắt đầu thấy "hệ thống gọi Interrupted" về hoạt động Queue như thế này:gián đoạn cuộc gọi hệ thống với hàng đợi xử lý

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 

Đây là một máy Fedora 10/Python 2.5 mà gần đây đã có một cập nhật bảo mật. Trước đó, phần mềm của chúng tôi đã hoạt động được khoảng một năm mà không có sự cố, hiện tại nó đang gặp sự cố hàng ngày.

Có chính xác/cần thiết để bắt ngoại lệ này và thử lại hoạt động Hàng đợi không?

Chúng tôi không có bất kỳ trình xử lý tín hiệu nào mà chúng tôi đã đặt, nhưng đây là một ứng dụng Tkinter có thể nó đặt một số. Có an toàn để xóa bộ xử lý SIGINT, điều đó có giải quyết được vấn đề không? Cảm ơn.

+1

Điểm rõ ràng, nhưng một hồi quy đột ngột sau khi cập nhật có vẻ như nó có thể là một lỗi trong gói bạn đang dựa vào. Bạn đã điều tra những gì cập nhật đã thay đổi chưa? –

+0

Ý tưởng hay, tôi đã kiểm tra yum.log và có 580 gói cập nhật. Không ai trong số những người Python có vẻ như là một vấn đề. Chúng ta có các máy Fedora 12 và 13 có vẻ đang hoạt động. Nếu vấn đề là cụ thể đối với "bản cập nhật Fedora 10 +", tôi sẵn sàng cân nhắc việc cập nhật lên Fedora mới nhất. – Philip

+0

Bây giờ chúng ta đã thấy điều này trên một máy Fedora 14, Python 2.7. – Philip

Trả lời

7

Dựa trên this thread trên comp.lang.python và this reply từ Dan Stromberg Tôi đã viết một RetryQueue đó là một sự thay thế thả-in cho Queue và mà không được công việc cho chúng tôi:

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) 
Các vấn đề liên quan