python学习笔记 day35 进程(二)

1. 不一样进程之间的资源是互相隔离的

from multiprocessing import Process
import os

n=100  # 每次开启一个进程就会把这里的代码从头至尾执行一遍,因此每个进程开始的n都是100,每开启一个进程对全局变量n都会执行减一操做
def func():
    global n
    n-=1
    print("子进程:%s,参数n:%s"%(os.getpid(),n))
if __name__=="__main__":
    for i in range(10):  # 建立10个进程
        p=Process(target=func)  # 开启的每个进程都是执行func函数
        p.start()
    print("主进程:%s,参数n:%s"%(os.getpid(),n))

运行结果:函数

 

因此不一样进程之间的数据是彻底隔离的;spa

2. 建立进程的另外一种方式

建立进程可使用Process类 或者能够本身建立一个类:3d

from multiprocessing import Process
import os

class MyProcess(Process):  # 自定义一个类继承自Process类
    def run(self):  # 当建立的子进程对象执行start方法时 就会自动调用r类内的un方法
        print("子进程:%s"%os.getpid())

if __name__=="__main__":
    p=MyProcess()   # 实例化一个类,建立进程
    p.start()   # 就会自动执行MyProcess类的run()方法
    print("主进程:%s"%os.getpid())
    

运行结果:code

 

 但是若是咱们想对要建立的子进程执行的函数传递一个参数,应该怎么操做:对象

其实只须要在建立类的时候,初始化方法中传递参数便可:blog

from multiprocessing import Process
import os

class MyProcess(Process):   # 建立一个类,继承自Process
    def __init__(self,arg1,arg2):
        super().__init__()   # 须要继承自父类Process的初始化方法,不要进行重写初始化方法,不然会覆盖,
        self.arg1=arg1
        self.arg2=arg2
    def run(self):  # 建立的进程对象执行start方法时会自动执行类中的run方法
        print("子进程:%s,参数(%s,%s)"%(os.getpid(),self.arg1,self.arg2))


if __name__=="__main__":
    p=MyProcess(1,2)  # 建立一个进程
    p.start()  # 开启一个进程,会自动执行类MyProcess类中的run()方法
    print("主进程:%s"%os.getpid())

运行结果:继承

 

 在自定义的类中实现其余的方法(好比下面例子中的walk()方法),在主进程中调实际上是在主进程中执行类中的方法,在类内调用类内的方法,会在子进程中执行类中的方法:进程

from multiprocessing import Process
import os

class MyProcess(Process):   # 建立一个类,继承自Process
    def __init__(self,arg1,arg2):
        super().__init__()   # 须要继承自父类Process的初始化方法,不要进行重写初始化方法,不然会覆盖,
        self.arg1=arg1
        self.arg2=arg2
    def run(self):  # 建立的进程对象执行start方法时会自动执行类中的run方法
        print("子进程:%s,参数(%s,%s)"%(os.getpid(),self.arg1,self.arg2))
        self.walk()  # 在run()方法中调用walk()方法,就是在子进程中执行该方法
    def walk(self):
        print("子(主)进程:%s"%os.getpid())  # 在类内调用walk()方法,就是子进程来执行,就是子进程的pid号,在主进程中调用walk()方法就由主进程来执行该方法,相应的就是主进程的pid号

if __name__=="__main__":
    p=MyProcess(1,2)  # 建立一个进程
    p.start()  # 开启一个进程,会自动执行类MyProcess类中的run()方法
    print("主进程:%s"%os.getpid())
    p.walk()   # 打印主进程的pid号,由于是在主进程中调用的该方法

运行结果:ip

相关文章
相关标签/搜索