进程对象的属性或方法详解

子进程的出现是为了实现并发

from multiprocessing import Process
import time

x=100
def task():
    global x
    x=0
    print('done')  # 父进程在等待的时间内子进程执行完了,打印出“done”
if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    time.sleep(5) # 让父进程在原地等待,等了500s后,才执行下一行代码
    print(x)   # x输出还是100 证明两个进程是互相独立的
进程内存相互独立

join()让父进程在原地等,直到子进程运行结束才运行下面的程序。

# 1、join
from multiprocessing import Process
import time

def task(name):
    print('%s is running ' %name)
    time.sleep(3)
    print('%s is done ' % name)


if __name__ == '__main__':
    p=Process(target=task,args=('子进程1',))
    p.start()
    p.join() # 让父进程在原地等待,等到子进程运行完毕后,才执行下一行代码
    print('')
join用法

p.join()--- 未用循环 同时发送进程创建请求,多进程同时运行。

from multiprocessing import Process
import time
def task(name,n):
    print('%s is running ' %name)
    time.sleep(n)
    print('%s is done ' % name)
if __name__ == '__main__':  # 开启多个进程,每个进程都向操作系统发出请求,操作系统分配内存
    p1=Process(target=task,args=('子进程1',1)) # 三个进程先创建出来
    p2=Process(target=task,args=('子进程2',2))
    p3=Process(target=task,args=('子进程3',3))
    start_time=time.time()
    p1.start()
    p2.start()
    p3.start()
    p3.join()   # 全部的子进程3s多一点执行完毕。多出来的一点是分配空间等的时间
    p1.join()  # 让父进程在原地等待,等到子进程执行完毕才执行下面的代码
    p2.join()   
    stop_time=time.time()
    print('',(stop_time-start_time))
子进程join方法

未同时向操作系统发起开启子进程的信号,所以都是在一个子进程结束才开始下一个信号发送,然后等待该子进程结束,进程没有同时运行,相当于串行,浪费时间。

from multiprocessing import Process
import time

def task(name,n):
    print('%s is running ' %name)
    time.sleep(n)
    print('%s is done ' % name)


if __name__ == '__main__':
    p1=Process(target=task,args=('子进程1',1))
    p2=Process(target=task,args=('子进程2',2))
    p3=Process(target=task,args=('子进程3',3))

    start=time.time()
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    p3.start()
    p3.join()

    stop=time.time()
    print('',(stop-start))
串行

把创建好的进程放进列表里,每创建一个就向操作系统发起一个开启子进程的请求,循环列表里的子进程,让父进程进入等待状态。

from multiprocessing import Process
import time

def task(name,n):
    print('%s is running ' %name)
    time.sleep(n)
    print('%s is done ' % name)


if __name__ == '__main__':
    # p1=Process(target=task,args=('子进程1',1))
    # p1.start()
    # p2=Process(target=task,args=('子进程2',2))
    # p2.start()
    # p3=Process(target=task,args=('子进程3',3))
    # p3.start()

    p_l=[]
    start=time.time()
    for i in range(1,4):
        p=Process(target=task,args=('子进程%s' %i,i))
        p_l.append(p)
        p.start()  # 把建好的进程放进列表里,同时建立一个进程向操作系统发起一个信号

    # print(p_l)
    for p in p_l:
        p.join()

    stop=time.time()

    print('',(stop-start))
循环子进程并发

父进程内查看自己进程pid(processing id)

# pid
from multiprocessing import Process
import time
import os

def task(n):
    print('%s is running ' %os.getpid())
    time.sleep(n)
    print('%s is done ' % os.getpid())


if __name__ == '__main__':
    p1=Process(target=task,args=(10,))
    # print(p1.pid)
    p1.start()
    print(p1.pid) # 父进程内查看子pid的方式
    print('')
父进程查看自己进程pid

查看自己和父进程的pid  ppid就是parent_pid 父进程

谁开启子进程谁就是他的父进程

from multiprocessing import Process
import time
import os

def task():
    print('自己的id:%s 父进程的id:%s ' %(os.getpid(),os.getppid())) # os.getppid()查看父进程id 8792
    time.sleep(200)

if __name__ == '__main__':
    p1=Process(target=task)
    p1.start()
    print('',os.getpid(),os.getppid()) # 这里的getpid查看子进程pid 8792
    # 爹=》主--》儿子
查看自己和父进程pid

了解知识点:子进程自定义名字

# 了解
# 具体的子进程名字
from multiprocessing import Process,current_process
import time

def task():
    print('子进程[%s]运行。。。。' %current_process().name)
    time.sleep(200)

if __name__ == '__main__':
    p1=Process(target=task,name='子进程1')
    p1.start()
    # print(p1.name)
    print('')
子进程名字

terminate

from multiprocessing import Process,current_process
import time

def task():
    print('子进程[%s]运行。。。。' %current_process().name)
    time.sleep(2)

if __name__ == '__main__':
    p1=Process(target=task,name='子进程1')
    p1.start()

    # print(p1.is_alive())  # True
    # p1.join()
    # print(p1.is_alive())  # False

    p1.terminate()
    time.sleep(1)
    print(p1.is_alive())  # False  如果没有time.sleep(1) 就是True
    print('')
terminate
tasklist | findstr 进程号  查找进程
taskkill /F/PID 进程号 杀死进程

僵尸进程和孤儿进程
僵尸进程与孤儿进程
在unix系统中init是所有进程的爹;创建进程用fork,回收进程用waitpid
僵尸进程(有害:占用pid):子代先于父代终结,其部分信息(pid等)没有从系统中删除,需要父代回收。join中含有回收子代信息的功能。
孤儿进程(无害):父代先于子代终结,子代终结后的部分信息由init代收。

from multiprocessing import Process                      
import time,os                                           
                                                         
def task(n):                                             
    print('%s is running' %n)                            
    time.sleep(n)                                        
                                                         
if __name__ == '__main__':                               
    p1=Process(target=task,args=(1,))                    
    p1.start()                                           
    p1.join()     # join中含有回收子代信息的功能(wait)                                       
    print('======主',os.getpid())                         
    time.sleep(10000)    
僵尸进程和孤儿进程
 
 
 

猜你喜欢

转载自www.cnblogs.com/Roc-Atlantis/p/9295785.html