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

  • 相关阅读:
    491 · 回文数
    936 · 首字母大写
    1343 · 两字符串和
    1535 · 转换成小写字母
    13 · 字符串查找
    146 · 大小写转换 II
    241 · 转换字符串到整数(容易版)
    46 · 主元素
    kotlin协程——>通道
    kotlin协程——>异步流
  • 原文地址:https://www.cnblogs.com/zhaogaolong/p/5534147.html
Copyright © 2011-2022 走看看