在与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),线程或类似的问题
您对此类变通方法有任何经验吗?