zoukankan      html  css  js  c++  java
  • 多线程 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

  • 相关阅读:
    pig安装
    [2013.10.29][Luogu OJ P1873]砍树
    [转帖]OIer之魂、
    [转帖]我们是OIer、
    10007:[2013.10.25]P1.滚土豆(potato.pas/c/cpp)
    [2013.10.18]P2.传作业 (pass.pas/c/cpp)
    [Luogu OJ P1619]解一元二次方程的烦恼
    [Luogu OJ P1433][2013.10.18]DFS基础题-吃奶酪
    高精度加减乘法小程序 Ver 0.9.5 beta
    [2013.10.11]P3.和为零
  • 原文地址:https://www.cnblogs.com/zhaogaolong/p/5534147.html
Copyright © 2011-2022 走看看