并发多线程
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始终没有运行完)

更多精彩