zoukankan      html  css  js  c++  java
  • multiprocessing模块-Process

    multiprocessing模块-Process

    # multiple  多元化的
    # processing 进程
    # multiprocessing 多元的处理进程的模块
    

    仔细说来,multiprocess不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。由于提供的子模块非常多,为了方便大家归类记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。

    Process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

    import os
    from multiprocessing import Process
    
    def func():
        print(os.getpid(),os.getppid())
    #     # pid process id           进程id
    #     # ppid parent process id   父进程id
    if __name__ == '__main__':
        print('main:',os.getpid(),os.getppid())
        p = Process(target=func)
        p.start()
        
    #main: 824 1272
    #1508 824
    
    #同时开启多个子进程
    import os
    import time
    from multiprocessing import Process
    
    def func(name,age):
        print('%s start'%name)
        time.sleep(1)
        print(os.getpid(),os.getppid(),name,age)
    
    if __name__ == '__main__':
        # 只会在主进程中执行的所有的代码你写在name = main下
        print('main :',os.getpid(),os.getppid())
        arg_lst = [('alex',84),('太白', 40),('wusir', 48)]
        for arg in arg_lst:
            p = Process(target=func,args=arg)
            p.start()  # 异步非阻塞
    
    # join的用法
    import os
    import time
    import random
    from multiprocessing import Process
    
    def func(name,age):
        print('发送一封邮件给%s岁的%s
    '%(age,name))
        time.sleep(random.random())
        print('发送完毕')
    
    if __name__ == '__main__':
        arg_lst = [('大壮',40),('alex', 84), ('太白', 40), ('wusir', 48)]
        p_lst = []
        for arg in arg_lst:
            p = Process(target=func,args=arg)
            p.start()
            p_lst.append(p)
        for p in p_lst:p.join()
            
        print('所有的邮件已发送完毕')
    #p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 
    

    开启进程的另一种方法

    ​ 面向对象的方法,通过继承和重写run方法完成了启动子进程
    ​ 通过重写init和调用父类的init完成了给子进程传参数

    开启进程的另一种方式

    class 类名(Process):
        def __init__(self,参数):
            self.属性名 = 参数
            super().__init__()
        def run(self):
            print('子进程要执行的代码')
    p = 类名()
    p.start()
    
    import os
    import time
    from multiprocessing import Process
    
    class MyProcess(Process):
        def __init__(self,a,b,c):
            self.a = a
            self.b = b
            self.c = c
            super().__init__()  
    
        def run(self):
            time.sleep(1)
            print(os.getppid(),os.getpid(),self.a,self.b,self.c)
    
    if __name__ == '__main__':
        print('-->',os.getpid())
        for i in range(10):
            p = MyProcess(1,2,3)
            p.start()
    

    Process类的一些其他方法属性
    name pid ident
    terminate()# 强制结束一个子进程
    isalive() 判断子进程是否还在运行

  • 相关阅读:
    C#学习教程
    数据库
    读写信号量
    qt配置tensorflow + opencv 提示protoc版本错误
    【1】EIGEN-Matrix类
    c++11的新特性
    ubuntu 16.04 python+tensorflow安装路径查看
    python的常用数据类型及其使用
    windows文件转LINUX文件格式
    ubuntu 16.04 + GPU 1080 + NVIDIA384
  • 原文地址:https://www.cnblogs.com/wyh0717/p/13339808.html
Copyright © 2011-2022 走看看