进程模块

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

      

 

posted @ 2021-02-03 12:00  苦行僧冬*婷  阅读(77)  评论(0)    收藏  举报