多进程

1.开启进程的两种方法

第一种:

from multiprocessing import Process
import time
def tak(name):
    print('%s 进程' % name)
    time.sleep(2)
    print('%s 子进程 ' % name)

if __name__ =='__main__':
    p1 = Process(target=tak,args=(1,))   # 创建线程
    p2 = Process(target=tak,args=(2,))
    p3 = Process(target=tak,args=(3,))
    p4 = Process(target=tak,args=(4,))
    p5 = Process(target=tak,args=(5,))

    p1.start()   # 向操作系统发送请求执行命令,但是操作系统什么时候执行就是操作系统的事了
    p2.start()
    p3.start()
    p4.start()
    p5.start()
    print('')

结果:

# 先运行的是主进程,因为开进程开销较大,时间比较长,当其他进程还没起来的时候,就会直接去执行主进程
1 进程
2 进程
4 进程
3 进程
5 进程      # 这里是会堵塞的,因为上面sleep了2秒,所有子进程都在这里进行堵塞了2秒后再进行打印,这里的结果为什么不是按顺序的,因为执行是操作系统进行执行的,你只能提交请求
1 子进程 
2 子进程 
4 子进程 
3 子进程 
5 子进程 

 

第二种:  这里自己写类进行继承Process

from multiprocessing import Process
import time
class Tak(Process):
    def __init__(self,name):
        super().__init__()         # 这里要加载Process中的方法
        self.name = name
 
    def run(self):              # 这里必须是run方法
        print('%s 进程' %  self.name)
        time.sleep(3)
        print('%s 子进程' %  self.name)

if __name__ == '__main__':
    p1 = Tak('1')    # 创建进程直接往自己的类里面进行传值就可以了
    p2 = Tak('2')
    p3 = Tak('3')
    p4 = Tak('4')
    p5 = Tak('5')

    p1.start()
    p2.start()
    p3.start()
    p4.start()
    p5.start()
    print('')

二、查看进程ID号:

查看当前进程id:os.getpid()

查看该进程的父级进程id: os.ppid()

from multiprocessing import Process
import time,os
def tak():
    print('%s 进程' % os.getpid(),os.getppid())
    time.sleep(2)
    print('%s 子进程 ' % os.getpid(),os.getppid())

if __name__ =='__main__':
    p1 = Process(target=tak,)
    p2 = Process(target=tak,)
    p3 = Process(target=tak,)
    p4 = Process(target=tak,)
    p5 = Process(target=tak,)

    p1.start()
    p2.start()
    p3.start()
    p4.start()
    p5.start()
    print('',os.getpid(),os.getppid())  # 你用什么运行的python,那么它的父级进程id号就是谁的进程id号,我这里用的是pycharm,它的父级进程id是pycharm的进程id

三、Process 中的 join方法

当主进程运行过程中如果想并发去处理其他的任务的时候,我们可以去开启子线程,主线程与子进程任务分为两种:

1、主进程与子进程的任务都是独立的时候,主进程运行完后要等子进程运行完后才回收资源

2、主进程进行运行的时候需要子进程的结果才能进行运行,就要等子进程运行完后主进程才开始运行,这里就要用到join方法了

from multiprocessing import Process

def tak(name):
    print('%s 进程' % name)
    print('%s 进程' % name)


if __name__ == '__main__':    # 这里在windows系统中开启进程一定是要在这个下面进行开进程的,不然会报错:IndentationError: unexpected indent
    p1 = Process(target=tak,args=(1,))
    p2 = Process(target=tak,args=(2,))
    p3 = Process(target=tak,args=(3,))

    p1.start()  
    p2.start()
    p3.start()

    p1.join()   # 等待p1结束,在等p1结束的时候,其他进程也在运行,这里是并行运行
    p2.join()
    p3.join()

    print('')  # 等前面的子进程运行完了才运行主进程,注意:注意只是主进程在阻塞,子线程都在并发执行

结果:

1 进程
1 进程
2 进程
2 进程
3 进程
3 进程
主

串行执行:这里如果要改成串行执行的话就要一个进程执行完了才执行下一个,这样确保了执行顺序,但是这样效率很低

from multiprocessing import Process

def tak(name):
    print('%s 进程' % name)
    print('%s 进程' % name)


if __name__ == '__main__':
    p1 = Process(target=tak,args=(1,))
    p2 = Process(target=tak,args=(2,))
    p3 = Process(target=tak,args=(3,))

    p1.start()    # 这里执行一个进程就要等这个进程执行完了才执行下一个
    p1.join()
    
    p2.start()
    p1.join()

    p3.start()
    p1.join()
    
    print('')

四、Process的其他属性

1、is_alive() 查看当前进程是否存活,存活返回True,否则返回False

2、terminate()  向操作系统发送关闭该进程的请求,与start()相反

3. name 查看当前进程的进程名

4. pid    查看当前的进程的id号

from multiprocessing import Process

def tak(name):
    print('%s 进程' % name)
    print('%s 进程' % name)


if __name__ == '__main__':
    p1 = Process(target=tak,args=(1,),name='卢本伟')  # 可在这里指定线程名,如果没指定,默认Process-1


    p1.start()
    p1.terminate()
 


     # 向操作系统发生关闭这个进程的请求,只是发送请求,什么时候关闭是操作系统的事
    print(p1.is_alive())    # 查看进程是否还是存活 存活为True  死了False
    print(p1.name,p1.pid)   # 这里name 可以访问该进程的指定的进程名,pid是可以查看进程的编号,
    # 这里是僵尸进程,在主进程还未关闭的时候可进行访问子进程的pid,当主进程关闭后会进行消除

结果:

True
卢本伟 5728

这里会发现为什么请求了关闭线程为什么还是存活,因为只是发送请求,什么时候关闭是操作系统的事情,所以要立即关闭需要在后面加上join(),等它运行接收后再执行下一步

 

posted @ 2019-09-04 19:24  tiwe  阅读(214)  评论(0编辑  收藏  举报