为什么当进程执行if语句里面lock.acquire()失败时不会跳出if,而是一直等待锁的释放

coding=utf-8

import time
import threading
class Account:
def __init__(self, _id, balance, lock):

self.id = _id 
self.balance = balance 
self.lock = lock 

def withdraw(self, amount):

self.balance -= amount 

def deposit(self, amount):

self.balance += amount 

def transfer(_from, to, amount):
if _from.lock.acquire():#锁住自己的账户

_from.withdraw(amount) 
time.sleep(1)#让交易时间变长,2个交易线程时间上重叠,有足够时间来产生死锁 
print 'wait for lock...'
if to.lock.acquire():#锁住对方的账户 
  to.deposit(amount) 
  to.lock.release() 
_from.lock.release() 

print 'finish...'

a = Account('a',1000, threading.Lock())
b = Account('b',1000, threading.Lock())
threading.Thread(target = transfer, args = (a, b, 100)).start()
threading.Thread(target = transfer, args = (b, a, 200)).start()

当进程执行if语句里面lock.acquire()时会一直等待锁的释放吗,为什么lock.acquire()失败时不会跳过if执行后面的语句?

阅读 5.8k
1 个回答
Lock.acquire([ blocking ] )
获取锁定,阻止或不阻止。
当调用阻塞参数设置为True(默认)时,阻塞,直到锁定解锁,然后将其设置为锁定并返回True。
当调用阻塞参数设置为False,不要阻塞。如果阻塞设置的呼叫True会阻塞,False 立即返回; 否则,将锁设置为锁定并返回True。

所以你可以写成 if _from.lock.acquire(False): 不阻塞

参考https://docs.python.org/2.7/l...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题