非守护线程:如果一个进程有多个线程,程序不会主线程结束后就结束,而是在所有线程都结束才结束 守护线程:主线程结束,子线程结束
def download(url): time.sleep(3) print(url, '结束') if __name__ == '__main__': t1 = Thread(target=download, args=('阿康的救赎',)) t2 = Thread(target=download, args=('阿康别急',)) # 添加守护线程 t1.setDaemon(True) t2.setDaemon(True) t1.start() t2.start() print('主线程结束')数据冲突:一般发生在多个线程对同一个数据进行操作的时候
from threading import Thread data = 0 def up_data(): global data for _ in range(100008): data += 1 def down_data(): global data for _ in range(100008): data -= 1 if __name__ == '__main__': # 情况1:在一个线程中对同一个数据进行加减操作 # up_data() # down_data() # print(data) # 情况2:在两个线程中进行加减操作 t1 = Thread(target=up_data) t2 = Thread(target=down_data) t1.start() t2.start() t1.join() t2.join() print(data)Lock - 锁类,传统锁,重量级锁(加锁和解锁需要手动进行)
1.创建锁类对象(有多少个数据就创建多少个锁) data_lock = Lock() def up_data(): global data for x in range(100000): # 2.枷锁 data_lock.acquire() data +=1 # 3.解锁 data_lock.release() def down_data(): global data for _ in range(100000): data_lock.acquire() data -= 1 data_lock.release() if __name__ == '__main__': t1 = Thread(target=up_data) t2 = Thread(target=down_data) t1.start() t2.start() t1.join() t2.join() print(data)需要其他进程的时候就创建进程类Process的对象 注意:不能直接在一个进程中去修改另外一个进程中的数据
def download(url): print(f'{url}开始下载') time.sleep(2) print(f'{url}下载结束') if __name__ == '__main__': p1 = Process(target=download, args=('待宰的羔羊',)) p2 = Process(target=download, args=('案板上的鱼肉',)) p1.start() p2.start()