一,多线程概念:
线程是程序执行最小单位,实际上进程只负责分配资源,而利用这些资源执行程序的是线程,也就是说进程是线程的容器,一个进程中最少有一个线程来负责执行程序。同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但他可与同属一个进程的其他线程共享进程所拥有的全部资源。这就像通过微信(一个进程)打开多个聊天窗口(多个线程)聊天一样,实现多任务的同时也节省了资源
二,线程的创建步骤
1.导入进程包
import threading
2.通过进程类创建进程对象
进程对象 = threading.Thread(target=任务名)
3.启动进程执行任务
线程对象.start()
通过线程类创建线程对象
线程对象=threading.Thread(target=任务名)
参数名 | 说明 |
target | 执行的目标任务名,这里指的是函数名(方法名) |
name | 线程名,一般不用设置 |
group | 线程组,目前只能使用None |
三,详细案例
(1).使用多线程实现多任务
import time
import threading
def listen():
for i in range(3):
print("在听薛之谦唱歌~~")
time.sleep(1)
def dance():
for i in range(3):
print("在看薛之谦跳舞")
time.sleep(1)
if __name__ == "__main__":
#正常按顺序执行
# listen()
# dance()
#使用多线程执行任务
list_thread=threading.Thread(target=listen)
dance_thread=threading.Thread(target=dance)
#启动程序
list_thread.start()
(2)线程执行携带参数任务
import time
import threading
def listen(num,name):
for i in range(num):
print(name)
print("在听薛之谦唱歌~~")
time.sleep(1)
def dance(count):
for i in range(count):
print("在看薛之谦跳舞")
time.sleep(1)
if __name__ == "__main__":
#以元组的方式进行传递
list_thread=threading.Thread(target=listen,args=(3,"薛之谦"))#元组如果是一个参数别忘了添加逗号
# 以字典的方式进行传递
dance_thread=threading.Thread(target=dance,kwargs={"count":5})
# 启动线程
list_thread.start()
dance_thread.start()
(3)主线程和子线程的结束术顺序
一般情况下,主线程都是等带子线程结束后,在结束的
import time
import threading
def work():
# 子线程工作2秒后结束
for i in range(10):
print("工作中...")
time.sleep(0.2)
if __name__ == "__main__":
# sub_thread = threading.Thread(target=work)
# sub_thread.start()
# 启动线程
sub_thread.start()
#主线程等待1秒后结束
time.sleep(1)
print("主线程结束了")
主线程结束不想等待子线程结束在结束,可以设置子线程守护主线程式
import time
import threading
def work():
# 子线程工作2秒后结束
for i in range(10):
print("工作中...")
time.sleep(0.2)
if __name__ == "__main__":
# sub_thread = threading.Thread(target=work)
# sub_thread.start()
# 主线程结束不想等待子线程结束在结束,可以设置子线程守护主线程
# 方式1.sub_thread = threading.Thread(target=work,daemon=True)
# 方式2.线程对象.setDaemon(True)
sub_thread = threading.Thread(target=work)
# 注意: 结束子进程必须在启动命令之前
sub_thread.setDaemon(True)
# 启动线程
sub_thread.start()
#主线程等待1秒后结束
time.sleep(1)
print("主线程结束了")
(4)线程的执行顺序
import threading
import time
def task():
# 这里延迟一秒是为了方便观察,
# 因为计算机同时创建5个,看不出来执行的先后顺序
time.sleep(1)
# 获取当前线程的对象
thread=threading.current_thread()
print(thread)
if __name__ == "__main__":
for i in range(5):
sub_thread = threading.Thread(target=task)
sub_thread.start()
# 结论:多线程执行顺序是无顺序的,由cpu来调度
结论:多线程执行顺序是无顺序的,由cpu来调度,我们无法判断谁先开始执行
四,最后进程和线程的区别
区别对比
1.创建进程的资源比创建线程的资源开销大
2.进程操作系统资源分配的基本单位,线程是cpu调度的基本单位
3.线程不能够独立执行,必须依存在进程中
I.进程优缺点:
优点:可以用多核
缺点:资源开销大
II.线程的优缺点:
优点:资源开销小
缺点:不能使用多核