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