zoukankan      html  css  js  c++  java
  • 笔记||Pyhthon3进阶之多线程操作共享数据

    # 多线程操作共享数据---------------------------------------------------------------

    # import threading
    # 使用锁
    # 获取锁对象,全局唯一的
    # lock = threading.Lock()

    # 加锁(获取锁) 未获取到的线程会阻塞程序,知道获取到锁才会往下执行
    # lock.acquire()

    # 释放锁 归还锁,其他线程可以拿去用了
    # lock.release()

    # 注意:加锁和释放锁必须成对出现,否则就有可能造成死锁


    # 为了避免出现死锁,推荐用如下上下文管理器在加锁
    # lock = threading.Lock()
    # with lock: # with语句会在这个代码块执行前自动获取锁,在执行结束后自动释放锁
          # 这里写自己的代码
          # pass

    # 使用锁的意义?
    # 加锁是为了对锁内资源进行锁定,避免其他线程篡改已被锁定的资源


    '''
    线程同步:如果多个线程共同对某个数据进行修改,可能会出现不可预料的结果
    为了保证数据的正确性,需要多多个线程进行同步
    使用Thread对象的Lock和Rlock可以实现简单的线程同步,这个两个对象都有acquire方法和release方法
    对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间。

    '''

    import threading
    import time

    num = 0
    lock = threading.Lock()


    def func(st):
           global num
           print(threading.currentThread().getName() + ' try to acquire the lock')
           if lock.acquire():
                  print(threading.currentThread().getName() + ' acquire the lock.')
                  print(threading.currentThread().getName() + " :%s" % str(num))
                  num += 1
                  time.sleep(st)
                  print(threading.currentThread().getName() + ' release the lock.')
                  lock.release()


    t1 = threading.Thread(target=func, args=(8,))
    t2 = threading.Thread(target=func, args=(4,))
    t3 = threading.Thread(target=func, args=(2,))
    t1.start()
    t2.start()
    t3.start()

  • 相关阅读:
    Reflector 已经out了,试试ILSpy
    visio studio删除空行
    SQL语句增加字段、修改字段、修改类型、修改默认值
    判断两个集合中 是否有相同的元素
    Rdlc 参数问题
    SQL Server 2008 报表服务入门【转】
    WebAPI异常捕捉处理,结合log4net日志(webapi2框架)
    HTTP Error 500.30
    前端Json 增加,删除,修改元素(包含json数组处理)
    IE浏览器F12调试模式不能使用或报错以及安装程序遇到错误0x80240037的解决办法
  • 原文地址:https://www.cnblogs.com/peipei-Study/p/12095406.html
Copyright © 2011-2022 走看看