IO操作超时

时间:2014-10-02 17:00:43

标签: python windows python-3.x io samba

在与UNC和网络路径一起工作时,os.path.exists()遇到了问题。

有些服务器往往以奇怪的方式死亡,而不是返回错误,而是挂起 130秒,然后返回False(我猜samba有一些奇怪的迷信超时,我无法找到和配置)。

所以我的问题是如何超时(原子)操作?

我只需要它在2秒内完成。我尝试过使用线程和mutable object for value这样返回:

import time
import threading
import os.path

class ValueContainer(object):
    ''' Generic imutable type
    '''

    def __init__(self, value=None):
        self.value = value


def timed_out_function(target, timeout, *args, **kwargs):
    ''' Times out function execution
    '''

    val = ValueContainer()

    # Inner function that passes result to mutable type
    def inner(retval, *args, **kwargs):
        retval.value = target(*args, **kwargs)

    # Create thread with this function
    t = threading.Thread(target=inner, args=(val, ) + args, kwargs=kwargs)
    t.daemon = True
    t.start()

    # Just wait for it
    t.join(timeout)

    if t.is_alive():
        raise Exception('Timeout')

    return val.value


print(timed_out_function(os.path.exists, 2, 'python_non_blocking_io.py'))
print(timed_out_function(os.path.exists, 2, 'Nope nope nope'))
timed_out_function(time.sleep, 2, 5)

# True
# False
# Traceback (most recent call last):
#   File "D:\tmp\python_non_blocking_io.py", line 39, in <module>
#     timed_out_function(time.sleep, 2, 5)
#   File "D:\tmp\python_non_blocking_io.py", line 32, in timed_out_function
#     raise Exception('Timeout')
# Exception: Timeout

但是我不确定这是否会创建太多的并行IO请求(一个接一个地连续请求流,每2秒递送一次130),线程或类似的问题

您对此类变通方法有任何经验吗?

0 个答案:

没有答案