挂起进程超时(卡住os调用)

时间:2017-03-03 17:27:26

标签: python

我有一个python程序访问NFS挂载的文件系统。有时,文件系统变得无法访问,并且一个简单的os.stat(“/ path / to / file”)将挂起进程。我已经尝试了以下超时包装器片段,但在处理“坏”操作系统调用时它似乎没有效果(在它不会返回的意义上是坏的):例如,它适用于:

with timeout(seconds=3)
   os.stat("/nfs/mounted/filesystem")

但它不起作用:

class timeout:
    """
    Usage:
        with timeout(seconds=3):
            sleep(4)
    """

    def __init__(self, seconds=1, error_message='Timeout'):
        self.seconds = seconds
        self.error_message = error_message

    def handle_timeout(self, signum, frame):
        raise TimeoutError(self.error_message)

    def __enter__(self):
        signal.signal(signal.SIGALRM, self.handle_timeout)
        signal.alarm(self.seconds)

    def __exit__(self, type, value, traceback):
        signal.alarm(0)

还有其他方法可以让我自己摆脱被绞死的过程吗?

 #define WIDTH   8
 #define HEIGHT  8

 #define sfu0(a, b) ((a) +((b) + *(int *) 0x12344321)) //clipping
 #define sfu1(a, b) ((a) -((b) + *(int *) 0x12344321)) //dividing by 13
 #define sfu2(a, b) ((a) +((b) - *(int *) 0x12344321)) /less multiplications

  void main(void)
 {
int a, b, result;
int max = 255;
char *buf_i = (char*)0x401000, *buf_o = (char*)0x402000;


for (a = 1; a < HEIGHT - 1; a++)
{
    for (b = 1; b < WIDTH - 1; b++)
    {
        result = sfu1((
                     -7*(int)buf_i[(a - 1) * WIDTH + b - 1] +
                      5*(int)buf_i[(a - 1) * WIDTH + b    ] +
                      2*(int)buf_i[(a - 1) * WIDTH + b + 1] +
                     -1*(int)buf_i[ a      * WIDTH + b - 1] +
                     15*(int)buf_i[ a      * WIDTH + b    ] +
                     -1*(int)buf_i[ a      * WIDTH + b + 1] +
                      2*(int)buf_i[(a + 1) * WIDTH + b - 1] +
                      5*(int)buf_i[(a + 1) * WIDTH + b    ] +
                     -7*(int)buf_i[(a + 1) * WIDTH + b + 1] +
                    128));

        /* Clipping */
        buf_o[a * WIDTH + b] = ((result) + ((max) + *(int *) 0x12344321));
    }
}

2 个答案:

答案 0 :(得分:0)

你可以试试这个,它没有优化,但应该有效:

i=0
while i<200:
    try:
        os.stat("/nfs/mounted/filesystem")
        i=200
    except:
        time.sleep(1)

答案 1 :(得分:0)

您可以使用看门狗进程

例如:

with timeout(seconds=3)
    watchdog_queue.put( (my_id,timeout=5) )
    os.stat("/nfs/mounted/filesystem")
    watchdog_queue.put( (my_id,clear) )

如果 Watchdog进程 5秒内没有收到(my_id,clear)消息而不是使用my_id终止进程/线程。