zoukankan      html  css  js  c++  java
  • 多线程 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  无论你执行多少次都没有问题

  • 相关阅读:
    【Vertica】vertica配置ODBC
    【oracle】【demo】oracle批量造数据
    【oracle】oracle系统视图nls_database_parameters
    【oracle】interval函数
    【DB2】DB2帮助文档
    【oracle】【sql】oracle去重
    【oracle】【sql】oracle分组
    【oracle】【性能】case表达式
    oracle EXP-00028
    Nginx系列~Nginx服务启动不了
  • 原文地址:https://www.cnblogs.com/zhaogaolong/p/5533956.html
Copyright © 2011-2022 走看看