首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python lock with-statement and timeout

python lock with-statement and timeout
EN

Stack Overflow用户
提问于 2013-05-25 01:00:46
回答 2查看 9.4K关注 0票数 17

我使用的Python 3序列如下所示:

代码语言:javascript
复制
lock = threading.Lock()
res = lock.acquire(timeout=10)
if res:
    # do something ....
    lock.release()
else:
    # do something else ...

我更喜欢使用with-语句,而不是显式的"acquire“和"release",但我不知道如何获得超时效果。

EN

回答 2

Stack Overflow用户

发布于 2013-05-28 09:00:45

使用上下文管理器可以很容易地做到这一点:

代码语言:javascript
复制
import threading
from contextlib import contextmanager

@contextmanager
def acquire_timeout(lock, timeout):
    result = lock.acquire(timeout=timeout)
    yield result
    if result:
        lock.release()


# Usage:
lock = threading.Lock()

with acquire_timeout(lock, 2) as acquired:
    if acquired:
        print('got the lock')
        # do something ....
    else:
        print('timeout: lock not available')
        # do something else ...

*注意:这在Python2.x中不起作用,因为Lock.acquire没有timeout参数

票数 15
EN

Stack Overflow用户

发布于 2013-05-28 09:17:34

稍微好一点的版本:

代码语言:javascript
复制
import threading
from contextlib import contextmanager


class TimeoutLock(object):
    def __init__(self):
        self._lock = threading.Lock()

    def acquire(self, blocking=True, timeout=-1):
        return self._lock.acquire(blocking, timeout)

    @contextmanager
    def acquire_timeout(self, timeout):
        result = self._lock.acquire(timeout=timeout)
        yield result
        if result:
            self._lock.release()

    def release(self):
        self._lock.release()

# Usage:
lock = TimeoutLock()

with lock.acquire_timeout(3) as result:
    if result:
        print('got the lock')
        # do something ....
    else:
        print('timeout: lock not available')
        # do something else ...

看起来你不能继承threading.Lock的子类,所以我不得不做一个包装类来代替。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16740104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档