5

Java では、tryLock(長い時間、TimeUnit 単位)を、ロックを取得するためのノンブロッキング試行として使用できます。Pythonで同等のものをどのように達成できますか? (Pythonic |慣用的な方法が推奨されます!)

Java tryLock:

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

パイソンロック:

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

2 に答える 2

7

try lockthreading 」動作は、モジュールを使用して取得できますLock.acquire(False)( 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

于 2014-01-21T10:12:59.837 に答える
1

ああ、悪い!まず、Locksの python リファレンスを読むべきでした。

Lock.acquire([ブロッキング])

に設定されたブロッキング引数で呼び出された場合、ブロックFalseしません。ブロッキングが に設定された呼び出しがブロックされる場合は、 すぐTrueに戻ります。Falseそれ以外の場合は、ロックを locked に設定して を返し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)
于 2013-06-13T13:32:45.697 に答える