Python Library中Condition的具体操作方案

开发 后端
本人对Python Library这一计算机语言十分感兴趣,以下的文章就是对Python Library中Condition的具体实际应用操作的介绍,和你一起分享。

你对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() 的线程必须事先获得锁,否则会抛出异常。

【编辑推荐】

  1. Python数组中实际应用的数据结构的操作方案
  2. Python字符串中字符的大写与小写的变化
  3. Python二维数组在创建过程中步骤详解
  4. 使用Python串口时应用到的模块有哪些
  5. 使用Python串口时应用到的模块有哪些
责任编辑:佚名 来源: 博客园
相关推荐

2010-03-12 11:03:30

Python学习

2010-03-24 10:06:37

Python嵌入C++

2010-03-17 13:14:00

Python Libr

2010-05-14 14:46:38

MySQL手动安装

2010-08-02 12:34:09

ADSL代理设置

2010-08-02 17:20:12

nfs启动Linux

2010-07-26 13:30:23

2010-03-17 12:53:43

Python Libr

2011-03-17 09:06:58

iptables映射端口

2009-12-30 15:47:40

Silverlight

2010-03-25 17:39:37

Python web

2010-07-15 19:46:40

关闭Telnet 23

2009-12-31 15:36:13

SilverLight

2009-12-31 15:36:13

SilverLight

2010-04-02 08:42:32

Oracle 游标

2010-04-01 17:25:46

Oracle死锁进程

2010-02-24 13:06:27

WCF使用Nhiber

2010-03-02 09:39:11

保护WCF服务

2010-03-02 16:15:59

WCF控制事务

2010-05-27 14:29:53

Linux查看进程
点赞
收藏

51CTO技术栈公众号