python中的多线程实例教程(2)
threading.Lock() 分配一个互斥锁
acquire([blocking=1]) 上锁(阻塞或者非阻塞,非阻塞时相当于try_lock,通过返回False表示已经被其它线程锁住。)
release() 解锁
下面通过一个例子来说明互斥锁的使用。在之前的例子中,多线程print会造成混乱的输出,这里使用一个互斥锁,来保证每行一定只有一个输出。
def threadFunction(arg):
while True:
lock.acquire()
print 'ThreadFuction - %d'%arg
lock.release()
if __name__ == '__main__':
lock = threading.Lock()
threading.Thread(target = threadFunction, args=(1,)).start();
threading.Thread(target = threadFunction, args=(2,)).start();
3.条件变量
条件变量总是与互斥锁一起使用的,threading中的条件变量默认绑定了一个RLock,也可以在初始化条件变量的时候传进去一个自己定义的锁。
可用的函数如下
threading.Condition([lock]) 分配一个条件变量
acquire(*args) 条件变量上锁
release() 条件变量解锁
wait([timeout]) 等待唤醒,timeout表示超时
notify(n=1) 唤醒最大n个等待的线程
notifyAll()、notify_all() 唤醒所有等待的线程
下面这个例子使用条件变量来控制两个线程交替运行
num = 0
def threadFunction(arg):
global num
while num < 10:
cond.acquire()
while num % 2 != arg:
cond.wait()
print 'Thread %d - %d' %(arg, num)
num += 1
cond.notify()
cond.release()
if __name__ == '__main__':
cond = threading.Condition()
threading.Thread(target = threadFunction, args=(0,)).start();
threading.Thread(target = threadFunction, args=(1,)).start();
输出如下
Thread 0 - 0 Thread 1 - 1 Thread 0 - 2 Thread 1 - 3 Thread 0 - 4 Thread 1 - 5 Thread 0 - 6 Thread 1 - 7 Thread 0 - 8 Thread 1 - 9 Thread 0 - 10
其实上面这个程序是有问题的,我们想打印的是0~9,但实际上10也被打印了出来,原因很简单,因为两个线程交替打印,使得num在一个线程中可能加2,从而导致10被打印出来,所以必须在打印前再次check。
相信本文所述对大家的Python程序设计有一定的借鉴价值。






