一、线程相关知识
- 进程
- 线程
- 主线程
1.进程
-在window操作系统中,一个进程就是一个exe或者dll程序,他们相互独立,相互也可以通信。
2.线程
- 在一个进程中可以包含多个线程,多个线程共享一块内存空间和一组系统资源。
- 系统在各个线程之间切换时,开销要比进程小得多,正因如此,线程被称为轻量级进程。
3.主线程
- Python 程序至少有一个线程,这就是主线程,程序在启动后由 Python 解释器负责创建主线程,在程序结束后由 Python 解释器负责停止主线程。
二、线程模块——threading
- active_count ():返回当前处于活动状态的线程个数。.
- current_thread ():返回当前的 Thread 对象。
- main_thread ():返回主线程对象。主线程是 Python 解释器启动的线程。
代码如下:
三、创建子线程
- 线程对象:线程对象是 threading 模块的线程类 Thread 或 Thread 子类所创建的对象。
- 线程体:线程体是子线程要执行的代码,这些代码会被封装到
个函数中。子线程在启动后会执行线程体。 - 实现线程体主要有以下两种方式:
1) 自定义函数实现线程体。
2) 自定义线程类实现线程体。
3.1自定义函数实现线程体
Thread(target=None, name=None, args=())
通过target来指定一个自定义函数
name来给线程命名(不调用系统则会自动分配)
args 给自定义函数提供参数
代码如下:
多线程:其他线程要想运行必须要当前线程休眠或者挂起
3.2自定义线程类实现线程体
创建一个Thread子类并重写run()方法
(run() 方法就是线程体函数)
代码如下:
四、线程管理
线程管理包括:
线程创建、线程启动、线程休眠、等待线程结束和线程停止。
4.1等待线程结束
有时,一个线程(假设是主线程)需要等待另外一个线程结束(假设是t1子线程)结束才能运行。
若主线程需要调用 t1子线程修改的返回数据时 才有必要阻塞等待t1结束(若不调用则不怎么需要等待t1子线程结束)
代码如下:
4.2线程停止
- 在线程体结束时,线程就停止了。
- 业务比较复杂时,线程体中执行一个"死循环"。
- 线程体是否持续执行"死循环"是通过判断停止变量实现的,"死循环"结束则线程体结束,线程也就结束了。
import threading
import time
#线程停止变量
isrunning = Ture #创建一个线程停止变量isrunning,控制线程结束
#工作线程体函数
def workthread_body():#工作体执行一些任务
while isrunning():#工作线程死循环
#线程工作开始
print('线程工作进行中')
#线程休眠
time.sleep(10) #休眠10s
print('工作线程结束...')
#控制线程体函数
def controlthread_body():
global isrunning
while isrunning:#控制线程体死循环
#从键盘输入停止命令exit
commend = 'exit':
isrunning = False
print('控制线程结束')
#主线程
#创建工作线程对象workthread
workthread = threading.Thread(target=workthread_body)
#工作线程来执行一些任务
#启动线程workthread
workthread.start()
#创建控制线程对象controlthread
controlthread = threading.Thread(target=controlthread_body)
#控制线程控制修改线程停止变量
#启动线程controlthread
controlthread.start()
global isrunning
由于需要在线程体中修改变量isrunning,因此需要将isrunning变量声明为global
(简单来说就是将其提升为全局变量,从只读变为可写)
def controlthread_body():
控制线程体从控制台读取指令, 根据指令修改线程停止变量
controlthread = threading.Thread(target=controlthread_body)
控制线程控制修改线程停止变量