开发者

interrupted system call with processing queue

We suddenly started see "Interrupted system call" on Queue operations like this:

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

This is a Fedora 10 / Python 2.5 machine that recently had a security update. Prior to that our software had run for about a year without incident, now it is c开发者_Go百科rashing daily.

Is it correct/necessary to catch this exception and retry the Queue operation?

We don't have any signal handlers that we set, but this is a Tkinter app maybe it sets some. Is it safe to clear the SIGINT handler, would that solve the problem? Thanks.


Based on this thread on comp.lang.python and this reply from Dan Stromberg I wrote a RetryQueue which is a drop-in replacement for Queue and which does the job for us:

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)


Finally this got fixed in python itself, so the other solution is to update to a newer python: http://bugs.python.org/issue17097

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜