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()

 

posted @ 2018-08-06 20:19  Burtit  阅读(164)  评论(0编辑  收藏  举报