zoukankan      html  css  js  c++  java
  • day33 创建进程的方法和相关操作

    方法一:

    multiprocess不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。由于提供的子模块非常多,为了方便大家归类记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。重点强调:进程没有任何共享状态,进程修改的数据,改动仅限于该进程内

    from multiprocessing import Process

    def func(n):
    print(n)
    if __name__=="__main__":
    p=Process(target=func,args=(5,)) #创建子进程,并传参,参数元组形式 也可以传关键字参数kwargs={"n":5}必须是字典key要与方法中的形参相同一致
    p.start() #操作系统发送指令创建进程并运行target=方法
    方法二:
    from multiprocessing import Process
    class MyProcess(Process):   #创建类
    def __init__(self,n,name):
    super().__init__() #执行下一个mro 直接写不加任何参数
    self.n=n #传参数
    self.name=name
    def run(self): #重写run方法
    print(self.n)
    print("子进程名称",self.name)
    print("子进程pid",self.pid)
    if __name__=="__main__":
    p=MyProcess(100,name="子进程1") #创建进程
    p.start() #操作系统发送指令开辟进程并运行run方法
    print("pid",p.pid)
    参数介绍:
    参数介绍:
    1 group参数未使用,值始终为None
    2 target表示调用对象,即子进程要执行的任务
    3 args表示调用对象的位置参数元组,args=(1,2,'egon',)
    4 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
    5 name为子进程的名称

    进程之间是空间隔离的:
    #我们说进程之间的数据是隔离的,也就是数据不共享,看下面的验证:
    from multiprocessing import Process
    import time
    n=100 #首先我定义了一个全局变量,在windows系统中应该把全局变量定义在if __name__ == '__main__'之上就可以了
    def work():
        global n
        n=0
        print('子进程内: ',n)
    if __name__ == '__main__':
        p=Process(target=work)
        p.start()
        time.sleep(2)
        p.join() #等待子进程执行完毕,如果数据共享的话,我子进程是不是通过global将n改为0了,但是你看打印结果,主进程在子进程执行结束之后,仍然是n=100,子进程n=0,说明子进程对n的修改没有在主进程中生效,说明什么?说明他们之间的数据是隔离的,互相不影响的
        print('主进程内: ',n)
    #看结果:
    # 子进程内:  0
    # 主进程内:  100
    process中的其他操作方法:
    1. p.start():启动进程,并调用该子进程中的p.run()
    2. p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法 
    3. p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
    4. p.is_alive():如果p仍然运行,返回True
    5. p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
    for循环在并发中的使用:
    # 验证for循环
    def func1(i):
    time.sleep(1)
    print(i)
    if __name__=="__main__":
    lst=[]
    for i in range(10):
    p1=Process(target=func1,args=(i,))
    p1.start()
    lst.append(p1)
    for el in lst: 在对象后加join
    el.join()
    print("主程序运行完成")
    验证并发时间:

    # 验证并发时间
    # def func1(n):
    # time.sleep(n)
    # print(n)
    # def func2(n):
    # time.sleep(n)
    # print(n)
    # def func3(n):
    # time.sleep(n)
    # print(n)
    # if __name__=="__main__":
    # p1=Process(target=func1,args=(1,))
    # p2=Process(target=func2,args=(2,))
    # p3=Process(target=func3,args=(3,))
    # p1.start()
    # p2.start()
    # p3.start()
    # print("主程序运行完成")
    子进程开启之后咱们是没法操作的,并且没有为子进程input输入提供控制台,所有你再在子进程中写上了input会报错,EOFError错误
  • 相关阅读:
    Spring 定时器的使用
    spring MVC 资料
    Thrift入门及Java实例演示<转载备用>
    json数组转数组对象
    UiPath Outlook邮件正文引用图片
    UiPath 执行VBA代码Selection.Copy复制不生效
    RPA工程师学习路径是怎样的?企业面试开发者从哪些方面考察?
    一个RPA项目需要部署多少个机器人
    未来的企业软件和RPA
    RPA——被遮住的代码
  • 原文地址:https://www.cnblogs.com/litieshuai/p/9837323.html
Copyright © 2011-2022 走看看