• 多线程 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

  • 相关阅读:
    关于MySQL相关的查看显示信息:
    学习笔记:MySQL列属性
    学习笔记:MySQL字符串类型
    学习笔记:MySQL操作初步
    学习笔记:MySQL数据库初步 概念
    PHP就业班心得:IP与域名以及DNS和端口号的概念
    PHP就业班心得:PHP的基本含义与功能特点
    PHP基础班初学感悟
    PHP基础班初学心得:用JQ实现表单的全选、反选、取消和删除功能
    PHP基础班初学心得:JS里inner的一些理解
  • 原文地址:https://www.cnblogs.com/zhaogaolong/p/5534147.html
Copyright © 2020-2023  润新知