2013-06-13 5 views
3

Java에서 tryLock(long time, TimeUnit unit)은 잠금을 확보하기위한 비 차단 시도로 사용될 수 있습니다. 파이썬에서 어떻게 동등한 효과를 얻을 수 있습니까? (파이썬은 | idiomatic 방법이 선호된다!)Python은 Java의`tryLock` (관용적)과 동일합니까?

자바 설정된 tryLock :

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

파이썬 잠금 :

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

관련성이 있습니까? http://stackoverflow.com/questions/8392640/how-to-implement-a-lock-with-a-timeout-in-python-2-7 – n611x007

답변

2

아야, 내 나쁜! 먼저 파이썬 reference for Locks을 읽어야합니다!

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

을 "을 잠 그려면 시도"동작은 threading 모듈의 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를 사용하는 만족스러운 방법을 알아낼 수 없습니다.

관련 문제