Python-эквивалент Java tryLock (идиоматический)?

В Java tryLock (long time, TimeUnit unit) может использоваться как неблокирующая попытка получить блокировку. Как можно достичь эквивалента в Python? (Предпочтителен Pythonic | идиоматический способ!)

Java tryLock:

ReentrantLock lock1 = new ReentrantLock()
if (lock1.tryLock(13, TimeUnit.SECONDS)) { ... }

Замок Python:

import threading
lock = Lock()
lock.acquire() # how to lock.acquire(timeout = 13) ?

person n611x007    schedule 13.06.2013    source источник
comment
Связанный ? stackoverflow.com/questions/8392640/   -  person n611x007    schedule 13.06.2013


Ответы (2)


Поведение «попробуйте заблокировать» можно получить с помощью threading модуля Lock.acquire(False) (см. документ Python):

import threading
import time

my_lock = threading.Lock()
successfully_acquired = my_lock.acquire(False)
if successfully_acquired:
    try:
        print "Successfully locked, do something"
        time.sleep(1)
    finally:
        my_lock.release()
else:
    print "already locked, exit"

Я не могу найти здесь удовлетворительного способа использования with.

person Mathias    schedule 21.01.2014

Ой, моя плохая! Я должен был прочитать справочник по блокировкам, чтобы начать с участием!

Lock.acquire ([блокировка])

При вызове с аргументом blocking, установленным в False, не блокировать. Если вызов с блокировкой, установленным на True, будет блокироваться, немедленно верните False; в противном случае установите блокировку на заблокированный и верните True.

Так что я могу сделать что-то вроде этого (или даже что-то более продвинутое: P):

import threading
import time

def my_trylock(lock, timeout):
    count = 0
    success = False
    while count < timeout and not success:
        success = lock.acquire(False)
        if success:
            break
        count = count + 1
        time.sleep(1) # should be a better way to do this
    return success

lock = threading.Lock()
my_trylock(lock, 13)
person n611x007    schedule 13.06.2013