Python零基础之多线程
1. 为什么要使用多线程
- 多线程类似于同时执行多个不同程序,多线程运行有如下优点:
- 使用线程可以把占据长时间的程序中的任务放到后台去处理。
- 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
- 程序的运行速度可能加快。
- 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
2. python如何实现多线程
2.1 python的多线程模块
-
Python3 线程中常用的两个模块为:
- _thread
-
_thread.start_new_thread ( function, args[, kwargs] )
- thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用"thread" 模块。为了兼容性,Python3 将 thread 重命名为 “_thread”。
-
- threading (提供基于线程的并行,推荐使用)
-
threading.Thread(group=group,target=test_func, name=‘name’,args=(num))
- group: 线程组
- target: 需要开启多线程的方法
- name: 线程的名称
-
- _thread
-
示例代码1:
import threading
import time
# 单线程
def sing():
for i in range(3):
print('正在唱歌...')
time.sleep(1)
def dance():
for i in range(3):
print('正在跳舞...')
time.sleep(1)
if __name__ == '__main__':
# sing()
# dance()
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
# 没有.start()则线程不会开启
t1.start()
t2.start()
2.2 主线程和子线程的执行关系
- 主线程会等待子线程结束之后在结束
- join() 等待子线程结束之后,主线程继续执行
- setDaemon() 守护线程,不会等待子线程结束
- join()和setDeamon()同时存在的时候,按照join()的情况执行
- 示例代码2:
# import time
#
# # 单线程
#
# def sing():
#
# for i in range(3):
#
# print('正在唱歌...')
# time.sleep(1)
#
# def dance():
#
# for i in range(3):
# print('正在跳舞...')
# time.sleep(1)
#
# if __name__ == '__main__':
# sing()
# dance()
# 多线程:
# 通过函数 - 使用threading中的Thread类创建
# 通过类 - 继承threading中的Thread类并实现run()方法
import threading
import time
def demo():
for i in range(5):
print('子线程')
time.sleep(1)
if __name__ == '__main__':
# 参数:
# group 线程组 None
# traget 要执行的方法
# name 线程名
t = threading.Thread(target=demo)
# 守护线程 不等待子线程结束
t.setDaemon(True)
# 开启线程
t.start()
# 主线程在子线程执行一次后,会向下执行代码
# 下边代码执行完毕后,会继续执行子线程代码
# 主线程会在所有子线程都执行结束以后再结束
for i in range(3