python – Pylons中的信号处理

我有一个pylons项目,我需要定期更新一些内存中的结构.这应该按需完成.我决定为此设计一个信号处理程序.用户将SIGUSR1发送到主塔架线程,并由项目处理.

这工作除了处理信号后,服务器崩溃以下异常:

File "/usr/lib/python2.6/SocketServer.py", line 264, in handle_request
   fd_sets = select.select([self], [], [], timeout)
select.error: (4, 'Interrupted system call')

有可能解决这个问题吗?

TIA.

是的,有可能,但使用库存Python库并不容易.这是因为Python将所有操作系统错误转换为异常.但是,EINTR应该真正导致重用所使用的系统调用.无论何时开始在Python中使用信号,您都会偶尔看到此错误.

我有code that fixes this(SafeSocket),通过分支Python模块并添加该功能.但它需要在使用系统调用的任何地方添加.所以这是可能的,但并不容易.但是你可以使用我的开源代码,它可以节省你多年的工作. 😉

基本模式是这个(作为系统调用装饰器实现):

# decorator to make system call methods safe from EINTR
def systemcall(meth):
    # have to import this way to avoid a circular import
    from _socket import error as SocketError
    def systemcallmeth(*args, **kwargs):
        while 1:
            try:
                    rv = meth(*args, **kwargs)
            except EnvironmentError as why:
                if why.args and why.args[0] == EINTR:
                    continue
                else:
                    raise
            except SocketError as why:
                if why.args and why.args[0] == EINTR:
                    continue
                else:
                    raise
            else:
                break
        return rv
    return systemcallmeth

你也可以在你的选择电话周围使用它.

相关文章
相关标签/搜索