Python基础–线程
线程的理解
- 线程是cpu调度(执行)的单位
- 程序会自动启用一个主线程
- 子线程是人为创建
线程是在进程的基础上进行运行的,可以说,没有进程就不会产生线程. ==在当前进程下的所有线程下,变量是被共享的==
线程的执行方式稍微有一点奇怪,在人们看来可以说是同时执行的,但是其实不是的. 线程是有CPU分配资源,随机进行运行的.每个线程都会运行一小段时间,然后运行其他线程.
线程的作用
- 完成多任务,提高cpu效率
- 线程的执行是需要CPU的调度完成
多线程的使用
1
2
3导包 import threading
加入任务 threading.Thread(target=任务名)
开启 xxx.start()参考实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32import time # 导入时间包
import threading # 导入线程包
def dance():
"""执行跳舞"""
while True:
print("跳舞")
time.sleep(5)
def song():
"""执行唱歌"""
while True:
print("唱歌")
time.sleep(5)
def main():
"""多线程开启"""
# threading.Thread(target=任务名)
thread_song = threading.Thread(target=song)
thread_dance = threading.Thread(target=dance)
# 开启
thread_song.start()
thread_dance.start()
if __name__ == '__main__':
main()多线程传参两种方式
- args使用元组
- 表示已元组的方式传参
- 传的元素位置需要与函数的形参位置一一对应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28import threading
import time
def dance():
"""执行跳舞"""
while True:
print("跳舞")
time.sleep(1)
def song(name,age):
"""执行唱歌"""
while True:
print("唱歌",name,age)
time.sleep(1)
def main():
"""入口函数"""
# 一边唱歌一边跳舞
thread_song = threading.Thread(target=song,args=("小白",18))
thread_song.start()
if __name__ == '__main__':
main()
- kwargs使用字典
- 表示以字典的形式传参
- 因为是无序的,所有key和参数对应,vlaue就是参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29import threading
import time
def dance(name,age):
"""执行跳舞"""
while True:
print("跳舞")
time.sleep(1)
def song(name,age):
"""执行唱歌"""
while True:
print("唱歌",name,age)
time.sleep(1)
def main():
"""入口函数"""
# 一边唱歌一边跳舞
thread_song = threading.Thread(target=song,args=("小白",18))
thread_song.start()
thread_dance = threading.Thread(target=dance,kwargs={"age":18,"name":"小花"})
thread_dance.start()
if __name__ == '__main__':
main()多线程的注意点
- 主线程会等待子线程结束而结束
- 守护线程,只要主线程结束守护线程就结束
- 线程执行是无序的
- 线程之间共享全局变量(共享就会有资源竞争的问题)
- 资源竞争解决方案
- 同步join
- join函数是将多个线程或者进程按照单线程的方式执行,执行了一个线程之后再去执行另外一个线程
- 缺点运算速度比较慢
- 互斥锁
- 同步join