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

  • 相关阅读:
    热修复之类加载机制总结
    socket之tcp如何维护长连接
    sqlite之多线程处理
    android主线程ActivityThread-转载
    线程之ThreadLocal使用
    图片之压缩总结
    线程之交替执行的实例
    git的最常用命令总结
    sqlite之常见的语句
    activity之分析-3分钟看懂Activity启动流程
  • 原文地址:https://www.cnblogs.com/zhaogaolong/p/5534147.html
Copyright © 2011-2022 走看看