进程模块
1.为什么要用 if __name__ == '__main__'
2.能不能给子进程传参数
3.能不能获取子进程的返回值
4.能不能同时开启多个子进程
5.jion的用法
6.用面向对象开启一个进程(能否传参,属性)
1. 答:对于不同的操作系统而言不一样
windows系统 开启子进程相当于导入父进程的文件(执行文件),必须要用 if __name__ == '__main__'
mac,linux系统 开启子进程相当于copy父进程中的内存,所以不需要if语句

2.答 可以传参数 参数以元组形式传入 args =(arg,)
from multiprocessing import Process import os def func(name,age): print(os.getpid(),os.getppid()) print('%s今年%s岁了'%(name,age)) if __name__ == '__main__': args = ('dong',12) print(os.getpid(),os.getppid()) p = Process(target=func,args=args) p.start()
3. 不能获取返回值,进程在创建时操作系统会将内存隔离
4.可以同时开启多个子进程,下面写多进程模拟发邮件过程(异步非阻塞)
from multiprocessing import Process import time def email(name,age): print('%s年龄%s开始发送邮件'%(name,age)) time.sleep(0.5) print('发送完毕') if __name__ == '__main__': arg_lst = [('alex',80),('太白',50),('wusir',55)] for arg in arg_lst: p = Process(target=email,args=arg) p.start()
5. jion 必须等进程结束后,才能执行后面的语句. 下面这个是同步阻塞例子
必须等待前面的子进程结束,才能执行后面的
from multiprocessing import Process import time def email(name,age): print('%s年龄%s开始发送邮件'%(name,age)) time.sleep(0.5) print('发送完毕') if __name__ == '__main__': arg_lst = [('李白',22),('杜甫',33),('王昭君',18)] for arg in arg_lst: p =Process(target= email,args=arg) #创建进程 p.start() #等待子进程结束,阻塞 p.join()
6.用面向对象开启进程,必须重写run(self)方法:
import os from multiprocessing import Process class Myprocess(Process): def run(self): print(os.getpid(),os.getppid()) if __name__ == '__main__': print(os.getpid()) for i in range(4): p = Myprocess() p.start()
能传参数,必须使用__init__方法,还要调用中的方法,不然会报错
import os from multiprocessing import Process class Myprocess(Process): def __init__(self,name,age): self.name1 =name self.age =age super().__init__() def run(self): print('run被执行了',self.name1,self.age) if __name__ == '__main__': lst = [('李白',22),('杜甫',33),('我',10)] for item in lst : name,age =item print(name,age) p = Myprocess(name,age) p.start()
属性: p.ident,p.pid获取进程id
p.name 获取进程名字
p.start() 开启进程 p.terminate() 关闭进程 p.is_alive() 判断进程是否存活
import time import os from multiprocessing import Process class Myprocess(Process): def __init__(self,a,b): self.a = a self.b = b super().__init__() def run(self): print() if __name__ == '__main__': p = Myprocess(1,2) p.start() print() print(p.pid,p.ident,p.name) print(p.is_alive()) p.terminate() print(p.is_alive()) time.sleep(0.01) print(p.is_alive())
运行结果:
2764 2764 Myprocess-1
True
True
False

浙公网安备 33010602011771号