• 多线程 python threading 简单锁/互斥锁


    测试代码:

    #!/usr/bin/python
    # coding:utf8
    import threading
    import time
    
    
    num = 0 
    def run(n):
        print 'this is %s num' % n
        global num 
        time.sleep(1)
        num += 1
    
    
    for i in range(200):
        t = threading.Thread(target=run, args=(i,))
        t.start()
    
    
    print num

    结果:

    image

    num 为什么没有添加呢? 主要是主进程没有等待该子进程执行完毕就stop了, 所以要等待所有的子进程执行完毕后再结束主进程

    #!/usr/bin/python
    # coding:utf8
    import threading
    import time
    
    p_list = []
    num = 0
    def run(n):
        print 'this is %s num' % n
        global num
        time.sleep(1)
        num += 1
    
    
    for i in range(200):
        t = threading.Thread(target=run, args=(i,))
        t.start()
        p_list.append(t)
    
    for p in p_list:
        p.join()
    
    print num

    执行结果:

    image

    啊结果怎么是194 啊,不是200吗,着是原因是在线程操作公共数据时候没有添加锁,导致所有拿取公共数据的时候没有规范

    加锁代码

    #!/usr/bin/python
    # coding:utf8
    import threading
    import time
    
    p_list = []
    num = 0 
    def run(n):
        print 'this is %s num' % n
        global num 
        time.sleep(1)
        lock.acquire()
        num += 1
        lock.release()
    
    
    lock = threading.Lock()
    for i in range(200):
        t = threading.Thread(target=run, args=(i,))
        t.start()
        p_list.append(t)
    
    for p in p_list:
        p.join()
    
    print num

    在看执行结果:

    image  无论你执行多少次都没有问题

  • 相关阅读:
    1864: [Zjoi2006]三色二叉树
    3611: [Heoi2014]大工程
    2286: [Sdoi2011]消耗战
    2298: [HAOI2011]problem a
    2037: [Sdoi2008]Sue的小球
    P4512 【模板】多项式除法
    P4238 【模板】多项式求逆
    3771: Triple
    P3365 改造二叉树
    1191: [HNOI2006]超级英雄Hero
  • 原文地址:https://www.cnblogs.com/zhaogaolong/p/5533956.html
Copyright © 2020-2023  润新知