Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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 - Fatal编程技术网

Python 挂起进程超时(操作系统调用卡住)

Python 挂起进程超时(操作系统调用卡住),python,Python,我有一个python程序访问NFS挂载的文件系统。有时,文件系统变得不可访问,一个简单的os.stat(“/path/to/file”)将挂起进程。我尝试了以下超时包装器代码段,但在处理“错误”的操作系统调用时(从不会返回的意义上说是错误的),它似乎并不有效:例如,它可以用于: with timeout(seconds=3) sleep(4) 但它不起作用: with timeout(seconds=3) os.stat("/nfs/mounted/filesystem") 有没

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

with timeout(seconds=3)
   sleep(4)
但它不起作用:

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)

您可以试试这个,它没有经过优化,但应该可以工作:

i=0
while i<200:
    try:
        os.stat("/nfs/mounted/filesystem")
        i=200
    except:
        time.sleep(1)
i=0
而我你可以使用看门狗进程

例如:

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

如果看门狗进程在5秒内没有收到
(my\u id,clear)
消息,则使用
my\u id

杀死进程/线程,我认为这不会起作用-不会引发异常。