进程的常用方法

时间:2019-09-16
本文章向大家介绍进程的常用方法,主要包括进程的常用方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、常用方法

join():阻塞主进程,主进程会等待子进程结束后结束主进程

#单个进程
from multiprocessing import Process
import time

def Text():
    print('子进程开始')
    time.sleep(2)
    print('子进程结束')


if __name__ == '__main__':
    p = Process(target=Text)
    p.start()  #告诉操作系统子进程开始
    p.join()   #阻塞主进程,主进程会等待子进程结束后结束主进程
    print('主进程结束')
#多个进程
from multiprocessing import Process
import time

def Text(i):
    print(f'子进程{i}开始')
    time.sleep(1)
    print(f'子进程{i}结束')


if __name__ == '__main__':
    start = time.time()
    for i in range(1,5):
        p = Process(target=Text,args=(i,))
        p.start()  #告诉操作系统子进程开始
        p.join()  # 阻塞主进程,主进程会等待子进程结束后结束主进程
        end = time.time()
    print(end - start)
    print('主进程结束')

搞这个程序我们把它搞成了串行,一个运行完另一个才能开始,跑着一个程序我们花了6.954221963882446秒,所以他失去了真正的意义        
----------------------------------------------------------------------------------------
子进程1开始
子进程1结束
。。。
子进程4开始
子进程4结束
6.954221963882446
主进程结束
def Text(i):
    print(f'子进程{i}开始')
    time.sleep(1)
    print(f'子进程{i}结束')


if __name__ == '__main__':
    p_list = []  #建立一个空列表
    start = time.time()
    for i in range(1, 5):  #生成五个客户端
        p = Process(target=Text,args=(i,))
        p.start()  #子进程开始
        p_list.append(p)  # 将对象分别追加到这个空列表中
    for p in p_list:
        p.join()
    end = time.time()
    print(end-start)
    print('主进程结束')
 
这个才是真正的实现了并发,总共时间才用了2.6215157508850098秒,而且join()也发挥了真正的作用。
-----------------------------------------------------------------------------------------
子进程1开始
子进程2开始
子进程4开始
子进程3开始
子进程1结束
子进程2结束
子进程4结束
子进程3结束
2.6215157508850098
主进程结束

os.getpid():获取子进程的ID

os.getppid():获取子进程的父进程的ID

import os
from multiprocessing import Process,current_process
import time

def Text():
    print('子进程开始')
    print('子进程的pid:',os.getpid())
    print('子进程的pid:',current_process().pid)   #查看当前进程的pid
    time.sleep(15)
    print('子进程结束')


if __name__ == '__main__':
    p = Process(target=Text)
    p.start()  #告诉操作系统子进程开始
    time.sleep(1)
    print('父进程的pid:',current_process().pid) #查看当前进程的pid
    print('父进程的pid:',os.getpid()) #查看fu进程的pid
    print('父进程的父进程的pid:',os.getppid()) #父进程的父进程的pid  pycharm的pid
    print('主进程结束')

#current_process().pid 写在什么进程下就查看什么进程的pid
# os.getpid() 写在什么进程下就查看什么进程的pid

current_process().name:查看当前进程的名字

def Text(i):
    print('子进程开始')
    time.sleep(0.2)
    print('子进程结束')
    print(current_process().name)  #查看当前进程的进程名


if __name__ == '__main__':
    for i in range(1,3):
        p = Process(target=Text,args=(i,),name = str(i))    #name = i  进程的姓名可以更改,但姓名一定是字符串

        p.start()  #告诉操作系统子进程开始
        p.join()   #阻塞主进程,主进程会等待子进程结束后结束主进程
        time.sleep(1)
    print(current_process().name)  # 查看当前进程的进程名
    print('主进程结束')

.is_alive:查看进程是否还活着

def Text():
    print('子进程开始')
    time.sleep(0.1)
    print('子进程结束')


if __name__ == '__main__':
    p = Process(target=Text)
    p.start()  #告诉操作系统子进程开始
    print(p.is_alive())  # 查看当前进程是否还活着  #True
    time.sleep(3)
    print(p.is_alive())  #查看当前进程是否还活着   #False  代码运行完了就算死了
    print('主进程结束')

.terminate(): 直接终止子进程

def Text():
    print('子进程开始')
    time.sleep(20)
    print('子进程结束')


if __name__ == '__main__':
    p = Process(target=Text)
    p.start()  #告诉操作系统子进程开始
    time.sleep(3)  #让他睡三秒,让子进程先试一下,效果所需
    p.terminate()  #告诉操作系统直接终止子进程
    print(p.is_alive())  # 查看当前进程是否还活着  #True
    time.sleep(5)
    p.join()  #主进程等待子进程先结束
    print(p.is_alive())  #查看当前进程是否还活着   #False  代码运行完了就算死了
    print('主进程结束')
    
 以下是得到的结果,无论子进程运行到哪里,只要执行p.terminate(),就立刻结束子进程 
-------------------------------------------------------------------------
子进程开始
True
False
主进程结束

二、守护进程


守护进程可以比作是宫廷忠心耿耿的太监,只要皇帝死了,他就得陪葬,而皇帝就像是主进程。

守护进程的本质其实就是一个子进程

主进程的代码执行完毕守护进程直接结束。但是此时主进程可能没有结束

def Text():
    print('守护进程开始')
    time.sleep(1.5)
    print('守护进程结束')


if __name__ == '__main__':
    p = Process(target=Text)
    p.daemon = True   #将子进程设置为守护进程
    p.start()  #告诉操作系统子进程开始
    time.sleep(2)
    print('主进程结束')
  
并没有打印出'守护进程结束'就说明子进程还没有结束,但是子进程已经随着主进程的代码执行结束而结束了
---------------------------------------------------------------------------------
守护进程开始
主进程结束
#多个进程
from multiprocessing import Process
import time

def Text1():
    print('守护进程开始')
    time.sleep(2)
    print('守护进程结束')


def Text2():  #再定义一个子进程
    print('子进程开始')
    time.sleep(1.5)
    print('子进程结束')

if __name__ == '__main__':
    p1 = Process(target=Text1)
    p2 = Process(target=Text2)
    p1.daemon= True  #将Text设置为守护进程
    p1.start()  #告诉操作系统子进程开始
    p2.start()  #告诉操作系统子进程开始
    time.sleep(2)
    print('主进程结束')
    
以下并没有打印守护进程结束,就说明主进程代码执行完毕的时候,守护进程随即结束
---------------------------------------------------------------------------------
守护进程开始
子进程开始
主进程结束
子进程结束

原文地址:https://www.cnblogs.com/lulingjie/p/11529109.html