线程

线程

一、线程概念

  • 什么是线程

在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程,线程顾名思义就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位为,而车间内至少有一个流水线

进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合)

线程才是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
posted @ 2019-12-11 20:56  YGZICO  阅读(149)  评论(0编辑  收藏  举报