zoukankan      html  css  js  c++  java
  • Python学习 13day__高级语法

    共享变量

      共享变量:多个线程访问同样变量
      解决方法:锁,信号灯
      锁(lock):
       是一个标志:表示一个线程占用一些资源
       使用过程:
       上锁
       使用共享资源,放心地用
       取消锁,释放资源


    运行结果,sum并不为零,原因:资源共享
     1 import threading
     2 sum = 0
     3 loopSum = 10000000
     4 def myAdd():
     5     global sum, loopSum
     6     for i in range(1, loopSum):
     7         sum += 1
     8 
     9 def myMinu():
    10     global sum, loopSum
    11     for i in range(1, loopSum):
    12         sum -= 1
    13 
    14 if __name__ == '__main__':
    15     print("Starting.......{0}".format(sum))
    16 
    17     t1 = threading.Thread(target=myAdd(), args=())
    18     t2 = threading.Thread(target=myMinu(), args=())
    19 
    20     t1.start()
    21     t2.start()
    22     t1.join()
    23     t2.join()
    24 
    25     print("Done...{0}".format(sum))

    加锁的代码
     1 import threading
     2 
     3 sum = 0
     4 loopSum = 10000000
     5 
     6 lock = threading.Lock()
     7 def myAdd():
     8     global sum, loopSum
     9     for i in range(1, loopSum):
    10         # 上锁
    11         lock.acquire()
    12         sum += 1
    13         # 释放锁
    14         lock.release()
    15 
    16 def myMinu():
    17     global sum, loopSum
    18     for i in range(1, loopSum):
    19         # 上锁
    20         lock.acquire()
    21         sum -= 1
    22         # 释放锁
    23         lock.release()
    24 
    25 if __name__ == '__main__':
    26     print("Starting.......{0}".format(sum))
    27 
    28     t1 = threading.Thread(target=myAdd(), args=())
    29     t2 = threading.Thread(target=myMinu(), args=())
    30 
    31     t1.start()
    32     t2.start()
    33     t1.join()
    34     t2.join()
    35 
    36     print("Done...{0}".format(sum))


    线程安全问题:
    如果一个资源/变量。它对于多线程来讲。不用加锁也部队引起任何问题,则称为线程安全
    线程不安全变量类型:list, set, dict
    线程安全变量类型: queue
    生产者消费者问题:
    一个模型,可以用来搭建消息队列
    queue是一个哦那个来存放变量的数据结构,特点是先进先出,内部元素排队
    死锁问题:
    可重入锁:
    一个锁:可以被一个县城多次申请
    主要解决递归调用的时候需要申请锁的情况
    import threading
    import time
    
    class MyThread(threading.Thread):
        def run(self):
            global num
            time.sleep(1)
    
            if mutex.acquire(1):
                num = num+1
                msg = self.name+'set num to '+str(num)
                print(msg)
                mutex.acquire()
                mutex.release()
                mutex.release()
    num = 0
    
    mutex = threading.RLock()              # RLock 可重入锁 此处如果使用Lock则会产生死锁
    
    def testTh():
        for i in range(5):
            t = MyThread()
            t.start()
    
    if __name__ == '__main__':
        testTh()
  • 相关阅读:
    【NOI D2T1】量子通信(容斥原理+卡常)
    CF1555D Say No to Palindromes(线段树)
    CF1554B Cobb
    CF1554A Cherry
    【做题笔记】UVA10162 Last Digit
    【做题记录】CF1223D Sequence Sorting
    CF39H
    UVA10763
    题解 AT2361 [AGC012A] AtCoder Group Contest
    このブログについて | About this blog
  • 原文地址:https://www.cnblogs.com/Burtit/p/9432666.html
Copyright © 2011-2022 走看看