zoukankan      html  css  js  c++  java
  • 『Python』 多线程 共享变量的实现

      简介:

    对于Python2而言,对于一个全局变量,你的函数里如果只使用到了它的值,而没有对其赋值(指a = XXX这种写法)的话,就不需要声明global。

    相反,如果你对其赋了值的话,那么你就需要声明global。

    声明global的话,就表示你是在向一个全局变量赋值,而不是在向一个局部变量赋值。

    若多个线程或进程同时操作这一变量可能会导致抢占资源的现象,变量不能按照预定的逻辑进行操作,这时,在改变变量前需要对变量加互斥锁,操作完成后释放互斥锁。

    题外话:

    GIL(Global Interpreter Lock) 全局解释器锁,导致任一时刻只能有一个线程使用解释器,当用于 IO 密集型任务时,IO 期间线程会释放解释器。

    在 CPU 计算繁忙的任务重 不建议使用多线程,在非 CPU繁忙型任务中建议使用多线程。

    顺便说下使用多进程的好处:完全并行,无 GIL 的限制,可充分利用多 CPU 多核的环境。

     

      多线程使用互斥锁Demo :

    '''
        多线程操作全局变量 使用互斥锁
        重点:声明一个全局互斥锁
    '''
    import threading
    import time
    
    counter = 0
    mutex = threading.Lock()
    
    class MyThread(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
    
        def run(self):
            global counter, mutex
            time.sleep(1);
            if mutex.acquire():
                counter += 1
                print "I am %s, set counter:%s" % (self.name, counter)
                mutex.release()
    
    if __name__ == "__main__":
        for i in range(0, 100):
            my_thread = MyThread()
            my_thread.start()
    

     

  • 相关阅读:
    我的Firefox
    九成偏股基金净值增长弱于大盘 仅18只跑赢指数
    大事记:
    Symantec AntiVirus企业版(接受管理)客户机端卸载方法
    CDP
    两行代码解决iOS上拉下拉时,底部栏顶部栏跟随手势滚动
    8Windows概要
    4断点和单步执行
    win7下windbg本机内核调试
    windbg技巧看和改标志位创建进程时断下
  • 原文地址:https://www.cnblogs.com/anka9080/p/5276858.html
Copyright © 2011-2022 走看看