• Process-join-多道技术,进程分类,进程的状态,进程和线程的对比总结表


    一、关于multiprocessing (关于进程的模块)模块Process方法

    关于multiprocess包的介绍:
    multiprocess该包中几乎包含了和进程有关的所有子模块。是python中一个操作、管理进程的包。 multi是取自multiple的多功能的意思,
    由于提供的子模块非常多,为了方便记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享
    process模块介绍:
        process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。
        强调:
        1. 需要使用关键字的方式来指定参数
        2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
    参数介绍:
    targe:表示调用对象,即子进程要执行的任务
    args:表示调用对象的位置参数元组,args=(1,"engo")
    kwargs:表示调用对象的字典,kwargs={"name":"egon",,"age":18}
    方法介绍: p.start() 启动进程,并调用该子进程中的p.run() p.run() 进程启动时运行的方法,正是他去调用target指定的函数,我们自定义类的类中必须重新定义. p.join([timeout]) 主线程等待p终止(是主线程处于等的状态,而p是处于运行的状态),timeout是可选的超时时间.
     
    p.name() #进程的名字
    from multiprocessing import Process
    import time
    def f1(): time.sleep(3) print("123") def f2(): time.sleep(3) print("撒拉嘿") #windows系统下,必须在代码中写main,否则会出现递归开启进程,报错(在系统创建一个子进程时,会import这个主进程的所有代码) if __name__ == '__main__': p1 = Process(target = f1,) #创建进程对象 p2 = Process(target = f2,) #创建进程对象
    p1.start() #给操作系统发送创建进程信号,后续进程的执行则由操作系统来决定 p2.start()

     Process方法传参的方式(常用):

    from multiprocessing import Process
    def f1(n):
        print(n)
    if __name__ == '__main__':
        # p1 = Process(target=f1,args=('大力与奇迹',)) #创建进程对象,第一种传参方式
        p1 = Process(target=f1,kwargs={'n':'大力'}) #字典key必须跟函数的形参名一致.创建进程对象,第二种传参方式
        p1.start()  #给操作系统发送了一个创建进程的信号,后续进程的创建都是操作系统的事儿了

     Process方法传参的第二种方式,自己定义类时>>>:

    class MyProcess(Process):
        def __init__(self,n):#自己定义的类,必须继承Process
            super().__init__()  #必须执行父类的init
            self.n = n
        def run(self):  #必须重新定义run方法
            print('小黑and%s不可告人的事情'%self.n)
    if __name__ == '__main__':
        p1 = MyProcess('小白')
        p1.start()

     二、关于join方法

    join方法有什么用:

    情况一:在主进程的任务与子进程的任务彼此独立的情况下,主进程的任务先执行完毕后,主进程还需要等待子进程执行完毕,然后统一回收资源

    情况二:如果主进程的任务在执行到某一个阶段时,需要等待进程执行完毕后才能继续执行,就需要有一种机制能够让主进程检测进程是否运行完毕,

    在子进程执行完毕后才继续执行,否则一直在原地阻塞.

    举个例子:for循环创建子进程,并且主进程等待所有子进程执行完毕,才执行

    import time
    from multiprocessing import Process
    def f1():
        time.sleep(0.01)
        print('xxx')
    if __name__ == '__main__':
        p_list = []
        #for循环创建子进程,并且主进程等待所有子进程执行结束,才继续执行
        for i in range(10):
            p = Process(target=f1,)
            p.start()
            p_list.append(p)
            # p.join() 
        for pp in p_list:
            pp.join()
        print('主进程结束')

    三、多道技术:

    产生的背景:多道技术产生的背景是第二代计算机的操作系统对cpu利用效率不高的状况

    什么是多道技术:

      多道指的是多个程序,多道技术的实现是为了解决多个程序竞争或者说共享同一个资源(比如cpu)的有序调度问题,解决方式即多路复用,

      多路复用分为时间上和空间上的多路复用.

    空间上的复用:

      将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有多道程序.

    时间上的复用:

      当一个程序i/o(阻塞)时,另一个程序可以使用cpu;一个进程占用cpu时间过长也会切换,或者说被操作系统夺走cpu的执行权限.

    四、分时操作系统:

    产生的背景:第二代计算机不能满足程序员们,在调试自己程序时,能很快可以得到响应.出现了分时操作系统.

    什么是分时操作系统:

      多个联机终端+多道技术

      20个客户端同时加载到内存,有17个在思考,3个在运行,cpu就采用多道的方式处理内存中的这3个程序,由于客户提交的一般都是尖端的指令而且很少有耗时长的,

    索引计算机能够为许多用户提供快速的交互式服务,所有的用户都以为自己独享了计算机的资源.

    五、进程

    什么是进程:

      程序的运行过程. 正在进行的一个过程或者说一个任务,而负责执行任务则是cpu

    什么是并发:

      是伪并行,即:看起来是同时运行.(单个cpu+多道技术就可以实现并发)

    什么是并行:

      同时运行,只有具备多个cpu才能实现并行.

    六、操作系统如何实现的并发(了解即可)

        硬件中断一个正在运行的进程,把此时进程运行的所有状态保存下来,为此,操作系统维护一张表格,即进程表,每个进程占用一个进程表项(也称为进程控制块)

      以此来保存进程由运行态转为就绪态或阻塞态时,必须保存的信息,从而保证该进程再次启动时,就像从而被中断过一样.

    七、进程状态

       在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。

    1.同步异步

    所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
         其实就是一个程序结束才执行另外一个程序,串行的,不一定两个程序就有依赖关系。 所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。
        至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。

    2.阻塞与非阻塞

    阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)
    等待消息通知时的状态角度来说的

     3.同步/异步 与 阻塞和非阻塞

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

     1 # 如何创建进程
     2 from multiprocessing import Process
     3 #如何创建线程                             #进程和线程除了导入的模块和函数不一样外,其他方法都一样,例如下指令运行start,还有传参时的Thread(target=f1,args=(1,))和Process(target=f1,args=(1,))
     4 from threading import Thread
     5 
     6 #如何创建进程池
     7 #1. from concurrent.futures import ProcessPoolExecutor
     8 #2. from multiprocessing import Pool
     9 #如何创建线程池               #创建进程池和线程池除了导入的模块和函数不一样,其他方法,指令都一样
    10 from concurrent.futures import ThreadPoolExecutor
    线程与进程总结
  • 相关阅读:
    20100420 ~ 20100520 小结与本月计划
    打造第二代测试框架TestDriven 2.0(六)—— 最新测试思路分析
    C# 反射性能测试
    Java 反射与cglib.proxy与cglib.beanmap与直接赋值 性能对比
    Apache Mina 源码分析。
    msn in c#, 最新代码
    20100520 ~ 20100620 小结与本月计划
    messageflow 集成到信息系统 第一阶段 手稿
    flash > AMF > java 的对象映射关系
    我在想:也许.net的基因里面就输给了java
  • 原文地址:https://www.cnblogs.com/lgw1171435560/p/10238357.html
Copyright © 2020-2023  润新知