1.并行:给每个cpu安排一个任务;简单说就是软件(任务)肩并肩同时进行
2.并发:cpu交替执行任务(软件)并不是真正意义上的同时进行,时间隔可能是0.1毫秒
一丶线程
1.线程是cpu调度的基本单位
def sing():
for i in range(5):
print('唱歌中')
time.sleep(0.1)
def dance():
for i in range(5):
print('跳舞中')
time.sleep(0.1)
if __name__ == '__main__':
# 在主线程中创建子线程 target后面只能跟函数名字
sing_thread = threading.Thread(target=sing)
dance_thread = threading.Thread(target=dance)
#启动线程 只有start启动了,线程才开始执行。才会出现在活动线程列表中
sing_thread.start()
dance_thread.start()
总结:线程的执行是无序的!由cpu来调度执行
2.线程执行任务传参数
import threading
def sing(num):
for i in range(num):
print('唱歌')
def student(name, age):
print(name, age)
if __name__ == '__main__':
# 创建子线程
# 方法1:args传参 必须是元组的形式
thread_sing = threading.Thread(target=sing, args=(3,))
thread_sing.start()
# 方法2:kwargs 必须以字典的形式传参,同时字典的key必须跟函数接收参数名相同
thread_student = threading.Thread(target=student, kwargs={'name': '张三', 'age': 18})
thread_student.start()
3.注意点
3.1 线程的执行是无序的!
3.2 主线程会等待所有的子线程结束后再退出
3.3 线程之间共享全局变量
? ? ? ? 解决方案:设置守护主线程!? ?主线程退出后子线程直接销毁,不执行子线程中的代码
#创建子线程
thread_sing = threading.Thread(target=sing)
#守护主线程 一旦主线程退出,子线程立马销毁结束
thread_sing.setDaemon(True)
4. 自定义线程
? ? ? ? 自定义线程类调用任务都需要通过run方法。而run方法在线程调用完start方法以后会自动调用run方法
|