[英]Is there a way to add a timeout to a system call in a thread?
我的用例:我想在文件上调用fcntl.flock()
但超时。 按照function 调用超时中的方法,我将代码包装在一个上下文管理器中,该管理器通过contextmanager
信号实现超时:
@contextmanager
def doTimeout(seconds):
"""Creates a "with" context that times out after the
specified time."""
def timeout_handler(signum, frame):
pass
original_handler = signal.signal(signal.SIGALRM, timeout_handler)
try:
signal.alarm(seconds)
yield
finally:
signal.alarm(0)
signal.signal(signal.SIGALRM, original_handler)
并按如下方式使用它:
with doTimeout(timeout):
try:
fcntl.flock(self.file, fcntl.LOCK_EX)
self.locked = True
return True
except (OSError, IOError) as e:
if e.errno == errno.EINTR:
return False
raise
这一切都很完美,但不幸的是我只能从主线程执行此操作,因为只有主线程可以捕获信号。 有没有办法从另一个线程做到这一点?
此时我的替代方案是定期测试锁然后休眠,或者启动子进程。 这些都不是理想的。 有没有更好的办法?
您可以使用文件锁库来完成您正在寻找的东西。 它支持timeout
参数来处理在放弃获取锁之前指定的超时。
此外,它以独立于操作系统的方式处理跨进程锁定,使用with lock:
stdlib multithreading / multiprocessing locks 应该熟悉的语法。
在 Linux 系统上,它使用fcntl.flock()
。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.