一般谈到多线程就会涉及到上锁的问题, 为什么要上锁? 是为了线程安全. 比方说我有两个线程, 都要拿到一个唯一的数据(只能被拿一次), 如果不上锁, 那么就很有可能两个线程同时拿, 数据就被拿了两次. 如果我们上锁, 我们就限制了拿的操作在某个时间只能有一个线程做, 如果这个时候其他线程也想做就得等待. 这样就保证了线程安全.
线程不安全的例子:
import threading, time a = 1 def get(): global a if(a): time.sleep(1) print(a) a -= 1 threads = [] for i in range(0, 10): t = threading.Thread(target = get) threads.append(t) for t in threads: t.start() for t in threads: t.join()本来输出的结果应该只有一个 ’ 1 ’ , 但是实际的输出却有0甚至是负数, 这就是线程不安全造成的, 多个线程同时通过了if判断, 然后输出了异常的值, 所以这个时候我们就需要上锁
import threading, time a = 1 lock = threading.Lock() def get(): global a lock.acquire() if(a): time.sleep(1) print(a) a -= 1 lock.release() threads = [] for i in range(0, 10): t = threading.Thread(target = get) threads.append(t) for t in threads: t.start() for t in threads: t.join()这样一来结果就对了