同步锁2 互斥锁

 1 import threading
 2 import time
 3 
 4 num = 100
 5 def add():
 6     global num
 7     s = num
 8     time.sleep(0.02)
 9     num = s - 1
10 
11 l = list()
12 for i in range(100):
13     t = threading.Thread(target=add)
14     l.append(t)
15     t.start()
16 for i in l:
17     i.join()
18 print(num)
19 输出:
20 99
21 
22 进程完成,退出码 0

遇到了IO阻塞,进行了切换。   

单个线程中间发生了切换。任务只处理了一半。    需要拿出一个解决的办法将正在执行的线程处理完,在进行下一个线程。

可以进行加上同步锁lock = threading.Lock(),使其变成不阻塞

 1 import threading
 2 import time
 3 
 4 num = 100
 5 lock = threading.Lock()
 6 def add():
 7     lock.acquire()
 8     global num
 9     s = num
10     time.sleep(0.02)
11     num = s - 1
12     lock.release()
13 
14 l = list()
15 for i in range(100):
16     t = threading.Thread(target=add)
17     l.append(t)
18     t.start()
19 for i in l:
20     i.join()
21 print(num)
22 输出:
23 0
24 
25 进程完成,退出码 0

加上锁之后就变成串行。

但是串行的就只有加锁的这三行,所以加锁还是有意义的。其它的代码照常同时是并行的执行。

  1 import threading
  2 import time
  3 
  4 num = 100
  5 lock = threading.Lock()
  6 def add():
  7 
  8     global num
  9     print(num)
 10     lock.acquire()
 11 
 12     s = num
 13 
 14     time.sleep(0.02)
 15     num = s - 1
 16     lock.release()
 17 
 18 l = list()
 19 for i in range(100):
 20     t = threading.Thread(target=add)
 21     l.append(t)
 22     t.start()
 23 for i in l:
 24     i.join()
 25 print(num)
 26 输出:
 27 100
 28 100
 29 100
 30 100
 31 100
 32 100
 33 100
 34 100
 35 100
 36 100
 37 100
 38 100
 39 100
 40 100
 41 100
 42 100
 43 100
 44 100
 45 100
 46 100
 47 100
 48 100
 49 100
 50 100
 51 100
 52 100
 53 100
 54 100
 55 100
 56 100
 57 100
 58 100
 59 100
 60 100
 61 100
 62 100
 63 100
 64 100
 65 100
 66 100
 67 100
 68 100
 69 100
 70 100
 71 100
 72 100
 73 100
 74 100
 75 100
 76 100
 77 100
 78 100
 79 100
 80 100
 81 100
 82 100
 83 100
 84 100
 85 100
 86 100
 87 100
 88 100
 89 100
 90 100
 91 100
 92 100
 93 100
 94 100
 95 100
 96 100
 97 100
 98 100
 99 100
100 100
101 100
102 100
103 100
104 100
105 100
106 100
107 100
108 100
109 100
110 100
111 100
112 100
113 100
114 100
115 100
116 100
117 100
118 100
119 100
120 100
121 100
122 100
123 100
124 100
125 100
126 100
127 0

这就是处理办法

猜你喜欢

转载自www.cnblogs.com/ch2020/p/12688828.html