信号量:允许同一时间几个线程访问公共数据
#!/usr/bin/python # coding:utf8 import threading import time p_list = [] num = 0 def run(n): semaphore.acquire() time.sleep(1) print 'this is %s num' % n semaphore.release() semaphore = threading.BoundedSemaphore(3) for i in range(30): t = threading.Thread(target=run, args=(i,)) t.start() p_list.append(t) for p in p_list: p.join() print num
执行结果:
适用场景
递归锁:几把锁和几把钥匙,不管是不是不一起的,只要能对上就OK
测试代码:
#!/usr/bin/python # coding:utf8 import threading import time def run1(): print 'grab the first part data' lock.acquire() global num num += 1 lock.release() def run2(): print 'grab the second part data' lock.acquire() global num2 num2 += 1 lock.release() def run3(): lock.acquire() res1 = run1() print 'between run1 and run2' res2 = run2() lock.release() print res1, res2 if __name__ == '__main__': num, num2 = 0, 0 lock = threading.Lock() for i in range(10): t = threading.Thread(target=run3) t.start() while threading.active_count() !=1: print threading.active_count() else: print '--all threads done---' print num, num2
结果: 死循环了,无法停止,着个时候就的用递归锁
递归锁代码
#!/usr/bin/python # coding:utf8 import threading import time def run1(): print 'grab the first part data' lock.acquire() global num num += 1 lock.release() def run2(): print 'grab the second part data' lock.acquire() global num2 num2 += 1 lock.release() def run3(): lock.acquire() res1 = run1() print 'between run1 and run2' res2 = run2() lock.release() print res1, res2 if __name__ == '__main__': num, num2 = 0, 0 lock = threading.RLock() for i in range(10): t = threading.Thread(target=run3) t.start() while threading.active_count() !=1: print threading.active_count() else: print '--all threads done---' print num, num2
执行结果: