你对Python 这一计算机语言感兴趣吗?你了解Python Library中Condition的具体实际应用操作的具体方法吗?假如你对Python Library的相关操作步骤感兴趣的话,你可以点击我们的文章对其进行一个更好的了解。

Condition 算是 Lock 和 Event 的杂交版本,除了作为 Lock 的基本功能外,还提供了 wait() 和 notify() 作为线程间 "消息通知"。


1.  from threading import * 2.  from time import *  
3.  condi = Condition()
4.  def t1():  
5.  condi.acquire()
6.  try:  
7.  for i in range(10):
8.  print currentThread().name, i  
9.  sleep(1)
10.  if (i == 4): condi.wait()   

# wait() 释放锁,并进入等待状态。直到接收到 notify() 发送的消息后再次试图获取锁,继续后续代码执行。


1.  finally: 2.  condi.release()  
3.  def t2():
4.  condi.acquire()  
5.  try:
6.  for i in range(10):  
7.  print currentThread().name, i
8.  sleep(1)  
9.  finally:
10.  condi.notify()   

# 在释放锁前通知等待的线程准备起床。


1.  condi.release() 2.  Thread(target=t1).start()  
3.  Thread(target=t2).start()  


输出:


1.  $ ./main.py 2.  Thread-1 0  
3.  Thread-1 1
4.  Thread-1 2  
5.  Thread-1 3   

Thread-1 4 <--- Thread1 释放锁,开始等待。Thread-2 0 <--- Thread2 获得锁,开始执行。


1.  Thread-2 1 2.  Thread-2 2  
3.  Thread-2 3
4.  Thread-2 4  
5.  Thread-2 5
6.  Thread-2 6  
7.  Thread-2 7
8.  Thread-2 8  

Thread-2 9 <--- Thread2 发送通知,并释放锁。Thread-1 5 <--- Thread1 收到消息,再次拿到锁,开始未完成的工作。


1.  Thread-1 6 2.  Thread-1 7  
3.  Thread-1 8
4.  Thread-1 9


wait() 实际可以分解为 "condi.release(); ... acquire()" 这两个动作。我们可以使用 Condition 包装已有的锁,当然也可以用 with/as 来改善我们的代码。



1.  lock = RLock() 2.  condi = Condition(lock)  
3.  def t1():
4.  with condi:  
5.  for i in range(10):
6.  print currentThread().name, i  
7.  sleep(1)
8.  if (i == 4): condi.wait()  
9.  def t2():
10.  with lock:  
11.  for i in range(10):
12.  print currentThread().name, i  
13.  sleep(1)
14.  condi.notify()  
15.  Thread(target=t1).start()
16.  Thread(target=t2).start()   


注意调用 notify() 和 notifyall() 的线程必须事先获得锁,否则会抛出异常。
以上就是Python Library中Condition的具体操作方案