一.线程
1.1 线程介绍
1.实现多任务的另一种形式
2.线程是程序执行的最小单位
3.同属一个进程的多个线程共享进程所拥有的全部资源
1.2 创建步骤
#1.导入线程包
import threading
#2.通过线程类创建进程对象
线程对象 = threading.Thread(target=任务名)
#3.启动线程执行任务
线程对象.start()
1.3 执行顺序
线程间的执行顺序是无序的,是由CPU调度决定某个线程先执行的。
1.4 线程的参数传递与守护主线程的用法与进程一致,此处不再赘述。特别注意设置守护主线程时要在 线程对象.start() 之前。
二. 进程和线程的关系
进程只负责分配资源,线程利用这些资源来执行程序,也就是说进程是线程的容器,一个进程最少有一个线程来负责执行程序,同时线程自己不拥有系统资源,它与同属于一个进程的其它线程共享进程所拥有的全部资源。
关系
- 线程是依附在进程里面的,没有进程就没有线程
- 一个进程默认提供一条线程,进程可以创建多个线程
区别
- 创建进程的资源开销要比创建线程的资源开销要大
- 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
- 线程不能够独立执行,必须依存在进程中
优缺点
进程:
优点:可以用多核
缺点:资源开销大
线程:
优点:资源开销小
缺点:不可用多核
三. 全局变量问题
线程间共享全局变量问题
原因:两个线程间因抢占CPU问题使计算结果错误
解决方法
1.join
2.互斥锁
互斥锁的使用步骤:
# 1 创建锁
mutex = threading.Lock()
# 2 上锁
mutex.acquire()
# 3 释放锁
mutex.release()
注:只上锁,不解锁可能会发生死锁问题。同一把锁必须先解锁才能再上锁。否则当线程一上锁后没有解锁,线程二无法上锁,CPU只能等待,无法结束程序。