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
这就是处理办法