Python еквивалент на `tryLock` на Java (идиоматичен)?

В 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)


Поведението „опитай за заключване“ може да се получи с помощта на Lock.acquire(False) на модула threading (вижте Python doc):

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

Ох, лошото ми! Трябваше да прочета препратката за ключалки на python, за да започна с!

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

Когато се извиква с аргумента блокиране, зададен на 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