并行与并发编程

  了解并行,并发,同步,异步,阻塞,非阻塞  ,  并在代码中体现

理论知识:

  进程间通信 简称: IPC

名词释义
  并发 : 就是同时做多件事

  并行 : 在同意时刻,处理多个任务,必须多核才能并行

  同步 : 多任务,多个任务之间执行没有先后顺序,可以同时运行,执行的先后顺序不会有什么影响,存在的多条运行主线

  异步 : 多任务,多个任务执行的时候要求有先后顺序,必须一个先执行完成后,另一个才能继续执行,只有一个主线

  阻塞 : 从调用者的角度出发,如果在调用的时候,被卡住,不能在继续向下运行,需要等待,就说是阻塞

  非阻塞 : 从调用者的角度出发,如果在调用的时候,没有被卡住,能够继续向下继续执行,无需等待,就说是非阻塞
       开启多进程及多进程相关常用方法

#并发:
早起单核CPU的时候,没有并行的概念,只有并发(微观上串行,宏观上并行)



进程的两种开启方法
1, p=Process(target=None(函数名),args(参数,))
2, 自定义类,继承Process父类


进程常用方法
1, start() 开启一个子进程
2, join() 异步变同步(就是让父进程停留在join这句话,等待子进程执行结束后再执行父进程)
3, terminate() 杀死进程
4, is_alive() 判断进程是否活着


进程的常用属性
1, p.name = 给p进程一个名字
2, p.pid 返回p进程的pid
3, p.daemon = True 将p进程设置为守护进程 (True为守护进程,False为普通进程)
守护进程的两个特点:
守护进程会随着父进程的结束而结束
守护进程不能在创建子进程


代码示例:
用 p=Process(target=None(函数名),args(参数,)) 这种方式开启进程,这个代码里面包含用join阻塞
from multiprocessing import Process
import time
import os

def func(i):
    time.sleep(2)
    print('这里是儿子%s进程,儿子自己的pid是%s,儿子的父进程pid是:%s'%('i',os.getpid(),os.getppid()))
if __name__=='__main__':
    p=Process(target=func,args=(1,))        #开启进程(子进程)
    p.start()           #执行子进程(相当于p.func())
    p.join()        #阻塞进程,等待子进程执行完后再执行主进程
    print('父进程自己的pid是:%s,父亲的父亲的pid是:%s'%(os.getpid(),os.getppid()))
以继承类的方式开启子进程
from multiprocessing import Process
import time

class Myprocess(Process):       #继承Process这个类
    def __init__(self,name):
        super(Myprocess,self,).__init__()      #执行父类的__init__方法
        self.name = name

    def run(self):      #子进程里的函数方法
        time.sleep(3)   #等待三秒
        print('继承类的方式开启子进程,名字是%s'% self.name)
if __name__=='__main__':      #创建子进程的固定用法
    p1=Myprocess('哈哈')      #给self.name 传进参数
    p1.start()      #告诉操作系统,马上执行这个子进程(跟p1.run() 执行的结果是一样的)
开启多个子进程
from multiprocessing import Process
import time
import os
def func(i):
    time.sleep(2)       #让下面的print 等待两秒
    print('子进程的名字是%s子进程的pid是%s,父进程的pid是%s'% (i,os.getpid(),os.getppid()))

if __name__=='__main__':    #创建子进程固定用法
    for i in range(3):
        p=Process(target=func,args=(i,))        #实例化一个进程的对象
        p.start()       #执行子进程
    print('父进程的pid是%s'% os.getppid())
杀死进程并判断是否杀死(p.terminate()杀死进程   ,   p.is_alive()  判断)
from multiprocessing import Process
import time
def func(i):
    print('哈哈哈')

if __name__=='__main__':
    p=Process(target=func,args=(1,))
    p.start()
    p.terminate()     #杀死p进程,让解释器告诉操作系统,请杀掉p进程
    print('呵呵',p.is_alive())
    time.sleep(1)       #这里需要让下一次程序执行等一会儿,不然看不到是否杀死了p进程,因为CPU运行速度太快
    print('呵呵',p.is_alive())
##返回一个bool值,如果返回True,代表进程还活着,如果返回False,代表子进程已经死了
##p.is_alive() 判断p进程是否还活着
##p.terminate() 杀死p进程

猜你喜欢

转载自www.cnblogs.com/hdy19951010/p/9507799.html