Process类

使用multiprocess 一个多元化进程模块。(涵盖了和进程相关的多有内容)

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

Process类帮助你启动和停止进程。(Process().start()  ; Process().terminate())

使用Process类创建一个子进程
import os import time from multiprocessing import Process def func(a,b,c): time.sleep(5) print(a,b,c,os.getpid(),os.getppid()) if __name__ == '__main__': print('主:', os.getpid()) Process(target=func,args=(1, 2, 3)).start() Process(target=func,args=(2, 3, 4)).start() Process(target=func,args=(3, 4, 5)).start()

(注: __name__==__mian__ 中的代码为主代码(父进程),调用的func()为子进程,父进程中的os.getpid()==子进程中的os.getppid(), 子进程中的os.getpid为子进程的进程ID)

(同时注意参数的加入方式)

 

其他操作方法

import os
import time
from multiprocessing import Process

def func(a,b,c):
    time.sleep(3)
    print(a,b,c,os.getpid(),os.getppid())

if __name__ == '__main__':
    print('主;',os.getpid())
    p = Process(target=func,args=(1,2,3))
    p.start()
    print(p.is_alive())
    p.terminate()
    print(p.is_alive())
    time.sleep(1)
    print(p.is_alive())
    p.name = 'douniwan'
    print(p.name)
    print(p.pid)
    print(p.__dict__)

(注: p.is_alive()查看进程是否运行着,p.terminate()关闭进程,但不会立即关闭,方式为:并行非阻塞,会过一会关闭,进程关闭后可以继续查看和更改实例化进程的属性)

 

开启多个子进程

import os import time from multiprocessing import Process def func(a,b,c): time.sleep(3) print(a,b,c,os.getpid(),os.getppid()) if __name__ == '__main__': Process(target=func,args=(1,2,3,)).start() Process(target=func,args=(2,3,4)).start() Process(target=func,args=(3,4,5,)).start() Process(target=func,args=(4,5,6,)).start() 

#两种方法
  for i in range(1,4): Process(target=func,args=(i, i+1, i+2)).start()

join

#join
import time import random from multiprocessing import Process def send_mail(name): time.sleep(random.uniform(1,3)) print('已经给%s发送邮件完毕'%name) if __name__ == '__main__': lst = ['alex','yuan','宝元','太白'] 阻塞等待一个子进程结束 p = Process(target=send_mail, args=('alex',)) p.start() p.join() # 阻塞,直到p对应的进程结束之后才结束阻塞
    print('所有的信息都发送完毕了') p_l = [] for name in lst: p = Process(target=send_mail,args=(name,)) p.start() p_l.append(p) for p in p_l : p.join() print('所有的信息都发送完毕了')

注意 join的使用 先把要阻塞的进程存放到列表里 然后分别与join结合。

 

进程守护

import time from multiprocessing import Process def func(): for i in range(20): time.sleep(0.5) print('in func') def func2(): print('star : func2') time.sleep(5) print('end : func2') if __name__ == '__main__': p = Process(target=func) p.daemon = True p.start() p2 = Process(target=func2) p2.start() print('in main') time.sleep(3) print('finished') p2.join

进程守护 p.daemon=True  守护主程序代码完成就结束     p2.join 为p2阻塞   在怕p2完成之前主程序代码没有结束。如果不加p2.join 主程序代码完成后就结束 会导致p2没有完成   。(p1始终没有运行完)

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄