gpt4 book ai didi

python - Pylons 中的信号处理

转载 作者:太空狗 更新时间:2023-10-30 02:23:12 30 4
gpt4 key购买 nike

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

除了在处理信号后,服务器崩溃并出现以下异常外,这可以正常工作:

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),通过 fork 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

您也可以只在您的 select 调用周围使用它。

关于python - Pylons 中的信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5633067/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com