zoukankan      html  css  js  c++  java
  • 进程,多进程,进程与程序的区别,程序运行的三种状态,multiprocessing模块中的Process功能,和join函数,和其他属性,僵尸与孤儿进程

    1.进程

    什么是进程:

      一个正在被运行的程序就称之为进程,是程序具体执行的过程,是一种抽象概念,进程来自操作系统

    2.多进程

     多个正在运行的程序

    在python中实现多线程的方法

    from multiprocessing import Process
    import os
    import time
    
    
    # 当出现一些耗时时间比较长的操作时,会导致程序进入阻塞状态,无法执行其他代码
    # 这个时候就可以开启子进程把任务交给他
    
    
    def task(name):
        print('name%s子进程开始!'% name)
        print('name%s子进程结束!'% name)
    
    if __name__ == '__main__':
        p = Process(target=task,args=('大哥',))
    
        # 开启子进程,本质是向操作系统发送请求,让它启动进程,通常不可能立即开启
        p.start()
        p.join()
        print('父进程结束')
    
    '''
    PS:windows 和 linux 开启进程的方式不同
    相同之处:都是需要将数据copy一份给子进程,这样  子进程才知道要干什么
    linux 会将父进程的所有数据 完全copy,然后拿到父进程,知道代码的位置,继续执行
    windows 会copy 一部分数据  同时会导入py文件来执行,这样一来就会递归开启进程
    所以windows中开启子进程都需要开启判断
    
    不过都建议加上判断,可以保证两个平台都可以使用
    
    记住:
    开启进程的代码,都把它放到 if __name__ == '__main__': 中即可
    '''

    自定义开启子进程:

    3.进程与程序的区别

    程序就是一堆计算机可以识别文件,程序在没有被运行就是躺在硬盘上的一堆二进制

    运行程序时,要从硬盘读取数据到内存中,CPU从内存读取指令并执行 ,

    一旦运行就产生了进程

    一个程序可以多次执行 产生多个进程,但是进程之间相互独立

    当我们右键运行了一个py文件时 ,其实启动的是python解释器,你的py文件其实是当作参数传给了解释器

    4.程序运行的三种状态

    1. 阻塞与非阻塞

      阻塞:当程序遇到IO操作(输入输出)时,就进入了阻塞状态

      非阻塞:程序正常运行种,没有遇到任何IO操作,就处于非阻塞状态

    阻塞与非阻塞说的是程序运行状态

    2.并发

      同一时间段,有多个程序都处于运行状态,但一个时间点只有一个程序被CUP处理,本质上切换执行,切换的同时,保存上一个任务的操作

    3.并行

      同一时间段,多个任务同时被CUP处理

    并发与并行说的是任务的处理方式

        PS:关于程序员永恒的话题  

          提高效率

          根本方法就是让程序尽可能处于运行状态

          减少IO 尽可能多占用CPU时间

          缓冲区就是用于减少IO操作的

    5.multiprocessing模块的使用(Process常用方法,join函数,)

    #  Process其他使用方法

    from multiprocessing import Process
    def task():
        print('121212')
        exit(100)  # 退出码
    
    if __name__ == '__main__':
        p = Process(target=task,name='李果')
        p.start()       # 此处名为懒加载优化机制,如果没有调用start ,那么该对象将不会被创建
        p.join()        # 等待子进程结束
        p.terminate()   # 终止进程
        print(p.is_alive())  # 判断进程是否存活
        print(p.pid)         # 查看PID
        print(p.exitcode)    # 获取退出码
    import time
    from multiprocessing import Process
    
    def stak(i):
        print('买烟去了')
        time.sleep(i)
        print('%s 买完了!'% i)
    
    if __name__ == '__main__':
        strat_time = time.time()
        p1 = Process(target=stak,args=(1,))
        p2 = Process(target=stak,args=(2,))
        p3 = Process(target=stak,args=(3,))
    
        # strat() 是同时进行的
        p1.start()
        p2.start()
        p3.start()
    
        # join等待的顺序是根据子进程工作结束的顺序来定的
        p1.join()
        p2.join()
        p3.join()
    
    
        end_time = time.time()
        print(end_time - strat_time)
        print('over')

    6.僵尸与孤儿进程

    孤儿进程:

    指的是,父进程先结束 ,而子进程还在运行着,

    孤儿进程无害,有 其存在的必要性

    例如:qq开启了浏览器,qq先退出了 浏览器应该继续运行

    孤儿进程会被操作系统接管

    僵尸进程:

     

    值得是,子进程已经结束了,但是操作系统会保存一些进程信息,如PID,运行时间等,此时这个进程就称之为僵尸进程

     

    僵尸进程如果太多将会占用大量的资源,造成系统无法开启新新进程

     

    linux 中有一个wai/waitpid 用于父进程回收子进程资源

     

    python会自动回收僵尸进程

     

     

     

  • 相关阅读:
    ArcGIS API for javascript开发笔记(四)——GP服务调用之GP模型的规范化制作详解
    ArcGIS API for javascript开发笔记(三)——解决打印输出的中文为乱码问题
    ArcGIS API for javascript开发笔记(二)——解决ArcGIS Service中的服务在内网环境下无法进行javascript预览问题
    解决GP服务产生的结果无法自动发布为地图服务的问题
    解决oracle12c安装报“[INS-30131]执行安装程序验证所需的初始设置失败(原因:无法访问临时位置)”方法
    Pdf File Writer 中文应用(PDF文件编写器C#类库)
    七牛云存储客户端(本人开发,开源)
    如鹏网 net高级技术 第二章 委托和事件(复习)
    如鹏网 net高级技术 第一章 各种知识点(复习)
    写个QuartzHelper类
  • 原文地址:https://www.cnblogs.com/liguodeboke/p/10957254.html
Copyright © 2011-2022 走看看