线程
一、线程概念
- 什么是线程
在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程,线程顾名思义就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位为,而车间内至少有一个流水线
进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合)
线程才是CPU上的执行单位
多线程是一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源
例如:北京地铁与上海地铁是不用的进程,而北京地铁里的1号线是一个线程,北京地铁所有的线路共享北京地铁所有的资源,比如所有的乘客可以乘坐所有线路
注意:线程和进程都是虚拟的概念,为了更好表达某种事物,开启一个进程,一定会自带一个线程,线程才是真正的执行者
-
为什么要使用线程
- 节省资源的占用
- 开启进程 - 会产生一个内存空间,申请一块资源。 - 会自带一个主线程 - 开启子进程的速度要比开启子线程的速度慢 - 开启线程 - 一个进程内可以开启多个线程,从进程的内存空间中申请执行单位。 - 节省资源。 - 开启三个进程 - 占用三份内存资源 - 开启三个线程: - 从一个内存资源中,申请三个小的执行单位
注意:进程与进程之间数据时隔离的,线程与线程之间的数据是共享的
二、开启线程的两种方式
- 方式一
from threading import Thread
import time
number = 1000
# 启动线程的方式一
def task():
global number
number = 100
print('start...')
time.sleep(1)
print('end...')
if __name__ == '__main__':
# 开启一个子线程
t = Thread(target=task)
t.start()
print('主进程(主线程)...')
print(number)
- 方式二
from threading import Thread
import time
class MyThread(Thread):
def run(self):
print('start...')
time.sleep(1)
print('end...')
if __name__ == '__main__':
# 开启一个子线程
t = MyThread()
t.start()
print('主进程(主线程)...')
三、线程池
限制提交任务的个数
# 线程池
from concurrent.futures import ThreadPoolExecutor
import time
p_pool = ThreadPoolExecutor(50)
def task(n):
print(f'from task1...{n}')
time.sleep(10)
if __name__ == '__main__':
n = 1
while True:
# 参数1:函数名
# 参数2:函数的参数1
# 参数3:函数的参数2
# submit(参数1,参数2,参数3)
p_pool.submit(task, n)
n += 1