1 简单的线程同步。
import threading
import time
class mythread(threading.Thread):
lock=threading.RLock()
t1=[]
for i in range(10):
x=0
for i in t1:
i.start()
运行结果如下:
>>> 3
6
9
12
15
18
21
24
27
30
>>>
30303030303030303030
而第一次,我们把全局变量X放到了acquire()和release()之间,python解释器每次回只允许一个线程对x进行操作,只有这个线程结束对其操作并且休眠结束打印出来以后,才允许下一个线程对x操作,所以输出的X是每次递增的,而且用时间也是比较长的。
2 使用条件变量保持线程同步
用Condition来实现著名的生产者和消费者的关系:
import threading
class Producer(threading.Thread):
class Consumer(threading.Thread):
con=threading.Condition()
x=0
p=Producer('Producer')
c=Consumer('Consumer')
p.start()
c.start()
p.join()
c.join()
print x
结果如下:
>>>
1000000
0
0
>>>
3 使用队列保持线程同步
import threading
import time
import Queue
class Producer(threading.Thread):
class Consumer(threading.Thread):
queue=Queue.Queue()
plist=[]
clist=[]
for i in range(10):
for i in range(10):
for i in plist:
for i in clist:
看结果:
>>>
Producer0 put Producer0 to queue
Producer1 put Producer1 to queue
Producer2 put Producer2 to queue
Producer3 put Producer3 to queue
Producer4 put Producer4 to queue
Producer5 put Producer5 to queue
Producer6 put Producer6 to queue
Producer7 put Producer7 to queue
Producer8 put Producer8 to queue
Producer9 put Producer9 to queue
Consumer0 get Consumer0 from queue
Consumer1 get Consumer1 from queue
Consumer2 get Consumer2 from queue
Consumer3 get Consumer3 from queue
Consumer4 get Consumer4 from queue
Consumer5 get Consumer5 from queue
Consumer6 get Consumer6 from queue
Consumer7 get Consumer7 from queue
Consumer8 get Consumer8 from queue
Consumer9 get Consumer9 from queue
>>>