我们突然开始在队列操作上看到“中断系统调用”,如下所示:
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处理程序是否安全,是否可以解决问题?感谢。
答案 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