Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 塔架信号处理_Python_Pylons_Signals - Fatal编程技术网

Python 塔架信号处理

Python 塔架信号处理,python,pylons,signals,Python,Pylons,Signals,我有一个挂架项目,我需要定期更新一些内存中的结构。这应该按需完成。我决定为此设计一个信号处理器。用户将SIGUSR1发送到主挂架线程,并由项目处理 除非在处理信号后,服务器崩溃,否则此操作有效,但出现以下异常: File "/usr/lib/python2.6/SocketServer.py", line 264, in handle_request fd_sets = select.select([self], [], [], timeout) select.error: (4, 'In

我有一个挂架项目,我需要定期更新一些内存中的结构。这应该按需完成。我决定为此设计一个信号处理器。用户将
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中使用信号,都会偶尔看到此错误

通过分叉Python模块并添加该功能,我有了(SafeSocket)。但它需要添加到使用系统调用的任何地方。所以这是可能的,但并不容易。但是你可以使用我的开源代码,它可能会为你节省数年的工作

基本模式如下(作为系统调用装饰器实现):


您也可以在选择呼叫时使用它。

实际选择行的详细信息并不重要。。。您的“fd_set=select.select([self],[],[],timeout)”行的工作原理应该完全相同

重要的一点是检查EINTR,如果发现了,则重试/循环。
哦,别忘了导入errno

仅供参考,以下是请求在EINTR上重试的(仍然打开的)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
    while True:
        try:
            readable, writable, exceptional = select.select(inputs, outputs, inputs, timeout)
        except select.error, v:
            if v[0] != errno.EINTR: raise
        else: break