1.0 面向对象的方法来创建线程:
import threading import time #面向对象很重要,面向对象很重要,面向对象很重要 class Mythread(threading.Thread): def __init__(self,num): threading.Thread.__init__(self) self.num = num #self.num是个实例变量,存在t1/t2的对象里面 #run是threading的内置方法 def run(self): print("running on number:%s" % self.num) time.sleep(3) if __name__ == '__main__': t1 = Mythread(1) #实例化一个对像 t2 = Mythread(2) #实例化一个对像 t1.start() t2.start()
2.0 Python线程同步锁:
同步锁:通常被用来实现共享资源的同步访问,为每一个共享资源创建一个Lock对象当你需要访问该资源时,调用qcuqire方法来获取锁对象(如果其他线程已经获得该锁,则当前线程需等待期被释放),待资源访问完后,在调用release方法释放锁
2.0.1 情况一:
import threading import time def addNum(): global num num -= 1 #不够时间CPU切换线程,所以线程之间不乱 num = 100 thread_list = [] for i in range(100): t = threading.Thread(target=addNum) t.start() thread_list.append(t) for t in thread_list: t.join() #等待所有线程执行完毕 print("finally num:", num)
2.0.2 情况二:num同一时间被拿走了两次或多次
import threading import time def addNum(): global num temp = num print('ok') num = temp - 1 num = 100 thread_list = [] for i in range(100): t = threading.Thread(target=addNum) t.start() thread_list.append(t) for t in thread_list: t.join() #等待所有线程执行完毕 print("finally num:", num)
finally num: 1
同步锁
lock = threading.Lock()
lock.acquire() #开启锁
lock.release() #释放锁
import threading import time def addNum(): global num lock.acquire() temp = num print('ok') num = temp - 1 lock.release() num = 100 thread_list = [] lock = threading.Lock() for i in range(100): t = threading.Thread(target=addNum) t.start() thread_list.append(t) for t in thread_list: t.join() #等待所有线程执行完毕 print("finally num:", num)