Rum*_*kin 4 python pylons signals
我有一个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')
Run Code Online (Sandbox Code Playgroud)
有可能解决这个问题吗?
TIA.
是的,有可能,但使用库存Python库并不容易.这是因为Python将所有操作系统错误转换为异常.但是,EINTR应该真正导致重用所使用的系统调用.无论何时开始在Python中使用信号,您都会偶尔看到此错误.
我有代码修复此(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
Run Code Online (Sandbox Code Playgroud)
你也可以在你的选择电话周围使用它.