进程基本知识

进程定义:

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()
原文地址:https://www.cnblogs.com/hum0ro/p/9225993.html