Process类
使用multiprocess 一个多元化进程模块。(涵盖了和进程相关的多有内容)
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始终没有运行完)