Python 线程同步
多个执行线程经常要共享数据,如果仅仅读取共享数据还好,但是如果多个线程要修改共享数据的话就可能出现无法预料的结果。
假如两个线程对象t1
和t2
都要对数值num=0
进行增1运算,那么t1
和t2
都各对num
修改10
次的话,那么num
最终的结果应该为20
。但是如果当t1
取得num
的值时(假如此时num
为0
),系统把t1
调度为“sleeping
”状态,而此时t2
转换为“running
”状态,此时t2
获得的num
的值也为0
,然后他把num+1
的值1
赋给num
。系统又把t2
转化为“sleeping
”状态,t1
为“running
”状态,由于t1
已经得到num
值为0
,所以他也把num+1
的值赋给了num
为1
。本来是2
次增1
运行,结果却是num
只增了1
次。类似这样的情况在多线程同时执行的时候是有可能发生的。所以为了防止这类情况的出现就要使用线程同步机制。
最简单的同步机制就是“锁”
锁对象用threading.RLock
类创建
mylock = threading.RLock()
如何使用锁来同步线程呢?线程可以使用锁的acquire()
(获得)方法,这样锁就进入“locked
”状态。每次只有一个线程可以获得锁。如果当另一个线程试图获得这个锁的时候,就会被系统变为“blocked
”状态,直到那个拥有锁的线程调用锁的release()
(释放)方法,这样锁就会进入“unlocked
”状态。“blocked
”状态的线程就会收到一个通知,并有权利获得锁。如果多个线程处于“blocked
”状态,所有线程都会先解除“blocked
”状态,然后系统选择一个线程来获得锁,其他的线程继续沉默(“blocked
”)。
import threading
mylock = threading.RLock()
class mythread(threading.Thread)
...
def run(self ...):
... #此处 不可以
放置修改共享数据的代码
mylock.acquire()
... #此处 可以
放置修改共享数据的代码
mylock.release()
 
相关文档:
▾ hide table of contents
0. ↑ 显示完整目录
1. 深入#
2. 布尔类型#
3. 数值类型#
1. 将整数强制转换为浮点数及反向转换#
2. 常见数值运算#
3. 分数#
4. 三角函数#
5. 布尔上下文环境中的数值#
4. 列表#
1. 创建列表#
......
python 的内嵌time模板翻译及说明
一、简介
time模块提供各种操作时间的函数
说明:一般有两种表示时间的方式:
第一种是时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一的
第二种以数组的形式表示即(struct_time),共有九个元素,分别表示,同一个时间戳的struct_time会因为时区不同而不同
year ......
最近,想在我的YouMoney(http://code.google.com/p/youmoney/)里面增加提取用户操作系统版本信息。比如windows用户,可能要返回Windows XP ,或者Windows 2003, 苹果用户应该返回Mac OS X 10.5.8。用了很多办法,包括在mac系统里调用系统命令,取环境变量,等等。最后无意发现,原来python里里面有个pl ......
Programming Python, 2nd Edition (O'Reilly)
http://www.osbbs.com/dl/Programming Python, 2nd Edition (O'Reilly).chm
很全很经典了python学习入门资料
OReilly - Learning Python:
http://www.osbbs.com/dl/OReilly - Learning Python.chm
......