中断系统调用处理队列

时间:2011-02-10 00:44:48

标签: python queue multiprocessing

我们突然开始在队列操作上看到“中断系统调用”,如下所示:

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处理程序是否安全,是否可以解决问题?感谢。

2 个答案:

答案 0 :(得分:7)

基于comp.lang.python上的this thread和Dan Stromberg的this reply我写了一个RetryQueue,它是Queue的替代品,它为我们完成了工作:

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)

答案 1 :(得分:0)

最后这在python本身得到修复,所以另一个解决方案是更新到更新的python: http://bugs.python.org/issue17097