• python程序中的线程操作


    一、什么是线程?

      引子:

        进程:资源单位(起一个进程,仅仅只是在内存空间中开辟一块独立的空间)。

        线程:执行单位(真正干活的人也就是真正被CPU执行的,是进程里面的线程。线程指的是代码的执行过程,执行代码中所需要使用到的资源都找所在的进程索要)。

      将操作系统比喻一个大的工厂,

      那么进程就相当于工厂里的车间。

      线程就是车间里面的流水线。

      每一个进程肯定自带一个线程。 

    总结:

      进程和线程都是虚拟单位,只是为了我们更加方便的描述问题

    二、为何要有线程?

      对比分析:

        开设进程:

          1、申请内存空间  耗资源

          2、‘拷贝代码’      耗资源

        开设线程:

          一个进程内可以开设多个线程,在同一个进程内开设多个线程无需再申请内存空间。

      总结:

        1、开设线程的开销远远小于开设进程的开销。

        2、同一个进程下的多个线程数据是共享的。

    我们要开发一款文本编辑器:

      需求:获取用户输入的功能、实时展示到屏幕的功能、自动保存到硬盘的功能

    针对上面的三个功能,开设进程还是线程?

      答案:开设三个线程处理上面的三个功能更加的合理。

    三、如何使用线程?

    # encoding=utf-8
    # auther:lsj
    # 开启线程的方式一
    from multiprocessing import Process
    from threading import Thread
    import time
    
    def task(name):
        print('%s is running'%name)
        time.sleep(1)
        print('%s is over'%name)
    
    # 开启线程不需要在main下面执行代码,直接书写即可
    # 但是我们还是习惯性的将启动命令写在main下面
    t = Thread(target=task,args=('lsj',))
    t.start()
    print('')
    
    运行结果如下:
    lsj is running主
    lsj is over
    线程与进程的区别:
    1、进程的时候“主”先打印,线程的时候代码先打印。
    2、创建进程需要先申请内存空间,而创建线程不需要申请内存空间。
    3、创建线程的开销非常小,几乎是代码一执行线程就已经创建了。
      4、开启线程不需要在main下面执行代码,直接书写即可,开启进程时windows系统下必须使用main。
    # encoding=utf-8
    # auther:lsj
    # 开启线程的方式一
    from multiprocessing import Process
    from threading import Thread
    import time
    
    def task(name):
        print('%s is running'%name)
        time.sleep(1)
        print('%s is over'%name)
    
    # 开启线程不需要在main下面执行代码,直接书写即可
    # 但是我们还是习惯性的将启动命令写在main下面
    # t = Thread(target=task,args=('lsj',))
    # t.start()
    # print('主')
    # 对比进程
    if __name__ == '__main__':
        p = Process(target=task,args=('lsj',))
        p.start()
        print('')
    
    进程的运行结果如下:
    主
    lsj is running
    lsj is over

     

    # encoding=utf-8
    # auther:lsj
    # 开启线程的方式二,使用类继承
    from multiprocessing import Process
    from threading import Thread
    import time
    
    class MyThread(Thread):
        def __init__(self,name):  # 针对双下划线开头和双下划线结尾(__init__)的方法 统一读成 双下init
            # 重写别人的方法又不知道别人的方法里有啥 调用父类的方法
            super().__init__()
            self.name = name
        def run(self):
            print('%s is running'%self.name)
            time.sleep(1)
            print('')
    
    if __name__ == '__main__':
        t = MyThread('lsj')
        t.start()
        print('')
    
    
    运行结果:
    lsj is running主
    
    牛

     

    四、线程对象的join方法

    # encoding=utf-8
    # auther:lsj
    # 线程的join方法
    from multiprocessing import Process
    import time
    from threading import Thread
    def task(name):
        print('%s is running'%name)
        time.sleep(3)
        print('%s is over'%name)
    
    if __name__ == '__main__':
        t = Thread(target=task,args=('lsj',))
        t.start()
        t.join()  # 主线程要等待子线程运行完毕再继续运行
        print('')
    
    不加join运行结果:
    lsj is running
    主
    lsj is over
    
    
    加入join运行结果:
    lsj is running
    lsj is over
    主

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    docker创建nginx+php-fpm+mysql环境(一分钟搭建lnmp)
    dcoker搭建wordpress
    docker搭建mysql
    nginx负载均衡精简配置实例
    docker配置阿里云镜像加速
    Centos7 ssh配置RSA证书登录
    Dockerfile centos7_php5.6.36
    Dockerfile cnetos7_nginx1.15.10
    Dockerfile centos7_tomcat7.0.64_jdk7u80
    centos7 安装docker
  • 原文地址:https://www.cnblogs.com/liunaixu/p/13185858.html
Copyright © 2020-2023  润新知