繁体   English   中英

有没有办法为线程中的系统调用添加超时?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM