• 进程基本知识


    进程定义:

    1.一个任务就是一个进程,进程是系统中的程序执行和资源分配的基本单位。

    2.每个进程都各自独立有自己的数据段(自己的数据),代码段(自己的代码)、和堆栈段。
    3.在创建子进程时对全局变量做了一个备份父进程与子进程的num两个不同的变量。
    4.父进程的num是父进程的堆栈定义,子进程的num是子进程的堆栈定义。

    5.由于计算机是4核,子进程1~4会同时进行,高于4个任务电脑随机分配给其他CPU工作

                  multiprocessing.cpu_count()               统计CPU

                 multiprocessing.active_children()         创建进程后查看多少进程

    一、初始化进程对象

    from multiprocessing import Process 

    target 进程目标  即 def fun: #创建的一个函数,即我们所执行的子进程 target!=fun()  否则target代表的就是函数的返回值

    args   参数(元祖)

    name   进程名字,可选

    p = Process(target=fun,args=('',),name='') 创建进程对象,通常需要在args参数后加一个逗号,因为是元组类型。

          os.getpid()        获取当前进程的ID
     os.getppid()            获取当前的进程的父(主)进程的ID
     p.daemon = True 守护进程后台运行,默认Flase,要通过start()设置
    p.pid
    进程ID
     p.name  进程名字
     p.terminate() 强行终止进程
    p.is_alive()  p.is_alive() 

     

     

     

       二、父(主)和子进程的运行顺序

                         p.start()                             启动进程

            p.join()            阻塞进程 直到调用此方法的进程终止才运行后面进程

          (如果没有p.join(),父(主)和子进程的顺序就是,先执行父进程,执行完毕之后在执行,子进程的程序,即父进程的结束不影响子进程,有的话,会先启动父(主)进程,然后启动、结束子进程,最后结束父(主)进程,即父进程等待所有子进程执行完毕之后在结束)

       

    三、全局变量不能够在多个进程中共享:

    在子进程修改全局变量,对父进程中的全局变量没有影响

    因为在创建子进程的同时对全局变量做了备份,父进程中的与子进程中的num(全局变量)是两个完全不同的变量,意思就是全局变量仅仅实在父进程中是全局变量供给使用

       

     四、启动大量子进程

           from multiprocessing import Pool

           def run:

                       ………

           if __name__==’__main__’:

             #创建Pool进程池,默认是cpu核心数,高于CPU核心数效率增大,例子中(  ,4>2)

               Pp = Pool(2)

                For i in range(4):

                 #创建进程,放入进程池统一管理

                   Pp.apply_async(run,ards=(‘ ‘,)

                 #子进程的执行是没有顺序的,是操作系统控制的

                Pp.close()

                Pp.join()

     
           p = Pool(target='',args=(''),name='')
                                
           p.map(get_infor,urls)       #map()函数是将urls中每个元素到放入到get_infor中执行一遍             
           p.apply()                   #同步进程池
           p.apply_async()             #异步进程池

              p.close()                   #关闭进程池,阻止更多任务提交到进程池

           (在调用join之前必须先调用close,调用close之后就不能在添加新的进程了)
           p.join()                    #阻塞进程 调用join前必须调用close

               (进程池对象调用join,会等待进程池中所有的子进程借宿完毕再去执行)

        
    五、进程间的通信

    from multiprocessing import Process,Queue

    #Queue把运算结果放在队列中,所有运算完后取出他,继续加载运算
    Def write(q): #往队列里面写数据 
            For value in [‘a’,’b’]:
                  q.put(value)  #将value放置队列中
    Def read(q):#从队列里面读取数据
            While True:  
             #一直读取数据,不知道队列中有多少数据
                  Value= q.get(True)   #从队列中获取值
            Print(“value=”+value)
    If __name__==’__name__’:
      #父进程创建队列,并传递给子进程

              q = Queue()             #初始化队列对象

         #创建2个子进程
        Pw = Process(target=write,args(q,))  #q是队列
       Pr = Process(target=read,args(q,))
        Pw.start()
        Pr.start()
        Pw.join()  #等代pw这个子进程结束
        #但是pr子进程里面是死循环,所有只能强制性结束该进程
        Pr.terminnate()
  • 相关阅读:
    扫描线 leetcode 759
    创建tensor的方法
    vector
    scatter_
    size、shape
    复杂问题
    random.normal
    set
    将可迭代对象中的元素通过字典映射成数字
    zipfile.ZipFile
  • 原文地址:https://www.cnblogs.com/hum0ro/p/9225993.html
Copyright © 2020-2023  润新知