多线程 python threading 信号量/递归锁

信号量:允许同一时间几个线程访问公共数据

#!/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

执行结果:

image 三个三个的执行

适用场景

image

递归锁:几把锁和几把钥匙,不管是不是不一起的,只要能对上就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

结果: 死循环了,无法停止,着个时候就的用递归锁

image

递归锁代码

#!/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

执行结果:

image

原文地址:https://www.cnblogs.com/zhaogaolong/p/5534147.html