【问题标题】:interrupted system call with processing queue带有处理队列的中断系统调用
【发布时间】:2011-06-24 13:07:48
【问题描述】:

我们突然开始在这样的队列操作中看到“系统调用中断”:

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 机器。在此之前,我们的软件已经运行了大约一年而没有发生任何事故,现在它每天都在崩溃。

捕获此异常并重试队列操作是否正确/必要?

我们没有设置任何信号处理程序,但这是一个 Tkinter 应用程序,也许它设置了一些。清除 SIGINT 处理程序是否安全,这会解决问题吗?谢谢。

【问题讨论】:

  • 显而易见,但更新后突然回归听起来可能是您所依赖的软件包中的错误。您是否调查过更新更改了什么?
  • 好主意,我检查了 yum.log 并且有 580 个更新包。 Python 似乎都不是问题。我们有 Fedora 12 和 13 机器,它们似乎在工作。如果问题是特定于“Fedora 10 + 更新”,我愿意考虑更新到最新的 Fedora。
  • 我们现在已经在 Fedora 14 机器 Python 2.7 上看到了这一点。
  • 我面临同样的问题,@Philip 感谢 googlegroup 链接。这对理解潜在问题非常有帮助。

标签: python queue multiprocessing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    基于 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 2013-04-11
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 2012-02-16
      • 2012-07-25
      相关资源
      最近更新 更多