zoukankan      html  css  js  c++  java
  • 线程

    线程

    一、线程概念

    • 什么是线程

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

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

    线程才是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
    
  • 相关阅读:
    附加数据库报错:无法打开物理文件 XXX.mdf",操作系统错误 5:"5(拒绝访问。)"
    Java(TM) SE Development Kit 6 卸载不掉怎么办
    (转)WCF入门教程(一)简介
    (转)SQL Server 2008怎样编辑200行以上的数据
    远程桌面下如何打开任务管理器
    在 sys.servers 中找不到服务器的解决办法,自己解决的
    MySQL 8小时问题
    Spring 事件机制
    MapReduce架构
    HDFS架构
  • 原文地址:https://www.cnblogs.com/YGZICO/p/12025080.html
Copyright © 2011-2022 走看看