XXX.join( ):表示同步执行(使用注意,要加在启动线程之后)
主线程等待第一个线程执行完成以后代码再继续执行,让其执行第二个线程
import threading
# 定义全局变量
g_num = 0
# 循环一次给全局变量加1
def test1():
for i in range(1000000):
global g_num
g_num += 1
print("test1:", g_num)
# 循环一次给全局变量加1
def test2():
for i in range(1000000):
global g_num
g_num += 1
print("test2:", g_num)
if __name__ == '__main__':
# 创建两个线程
first_thread = threading.Thread(target=test1)
second_thread = threading.Thread(target=test2)
# 启动线程
first_thread.start()
# 主线程等待第一个线程执行完成以后代码再继续执行,让其执行第二个线程
first_thread.join() # join:表示同步执行
# 同步: 一个任务执行完成以后另外一个任务才能执行,
# 同一个时刻只有一个任务在执行
print("第一个线程执行完啦")
second_thread.start()
互斥锁( 同步锁 )
多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制
import threading
# 定义全局变量
g_num = 0
# 创建全局互斥锁
lock = threading.Lock()
# 循环一次给全局变量加1
def test1():
# 上锁
lock.acquire()
for i in range(1000000):
global g_num
g_num += 1
print("test1:", g_num)
# 释放锁
lock.release()
# 循环一次给全局变量加1
def test2():
# 上锁
lock.acquire()
for i in range(1000000):
global g_num
g_num += 1
print("test2:", g_num)
# 释放锁
lock.release()
if __name__ == '__main__':
# 创建两个线程
first_thread = threading.Thread(target=test1)
second_thread = threading.Thread(target=test2)
first_thread.start()
second_thread.start()
# 提示:加上互斥锁,那个线程抢到这个锁我们决定不了,先抢到锁线程先执行,没有抢到的线程需要等待
# 加上互斥锁多任务瞬间变成单任务,性能会下降,也就是说同一时刻只能有一个线程去执行