线程也是实现多任务的另一种方式
线程是进程中执行代码的一个分,线程的执行需要cup调度完成
1、线程之间的执行使无序的
2、主线程会等待所有子线程执行结束再结束
def task():
for i in range(5):
print("test",i)
time.sleep(0.5)
if __name__ == "__main__":
# 进程守护
task_thread = threading.Thread(target=task,daemon=True)
task_thread.start()
time.sleep(1)
print("over")
当主线程完成后子线程就自动结束,这里用到的是daemon=True,默认daemon=Fasle,当子线程完成后才结束。【守护主线程】
def task():
for i in range(5):
print("test",i)
time.sleep(0.5)
if __name__ == "__main__":
# 进程守护
task_thread = threading.Thread(target=task)
task_thread.setDaemon(True)
task_thread.start()
time.sleep(1)
print("over")
使用.setDaemon(True)设置守护主线程。
3、线程之间共享全局变量
join:主线程等待添加数据的子线程执行完毕再继续往下执行,添加完再执行的,可以使线程有先后的顺序
import threading
import time
def dance(name):
for i in range(3):
print(f"Dance{name}")
def sing(name):
for i in range(3):
print(f"SING{name}")
if __name__ == "__main__":
# sing_thread = threading.Thread(target=sing,kwargs={'name':'hjw1'})
dance_thread = threading.Thread(target=dance,args=('hjw',))
# sing_thread.start()
sing_thread = threading.Thread(target=sing,args=('hjw123',))
dance_thread.start()
dance_thread.join()
sing_thread.start()
sing_thread.join()
结果为:
Dancehjw
Dancehjw
Dancehjw
SINGhjw123
SINGhjw123
SINGhjw123
4、线程之间共享全局变量数据出现错误问题
g_sum = 0
def sum_num1():
for i in range(1000000):
global g_sum
g_sum += 1
print('sum',g_sum)
def sum_num2():
for i in range(1000000):
global g_sum
g_sum += 1
print('sum',g_sum)
if __name__ == '__main__':
one_task_thread = threading.Thread(target=sum_num1)
two_task_thread = threading.Thread(target=sum_num2)
one_task_thread.start()
two_task_thread.start()
运行结果:
sum 1222845
sum 1811120
这里我们使用线程同步
a、线程等待
g_sum = 0
def sum_num1():
for i in range(1000000):
global g_sum
g_sum += 1
print('sum',g_sum)
def sum_num2():
for i in range(1000000):
global g_sum
g_sum += 1
print('sum',g_sum)
if __name__ == '__main__':
one_task_thread = threading.Thread(target=sum_num1)
two_task_thread = threading.Thread(target=sum_num2)
one_task_thread.start()
one_task_thread.join()
two_task_thread.start()
结果为:
sum 1000000
sum 2000000
b、互斥锁
g_sum = 0
# 创建互斥锁
look = threading.Lock()
def sum_num1():
look.acquire()
time.sleep(4)
for i in range(1000000):
global g_sum
g_sum += 1
print('sum',g_sum)
look.release()
def sum_num2():
look.acquire()
time.sleep(2)
for i in range(1000000):
global g_sum
g_sum += 1
print('sum',g_sum)
look.release()