zoukankan      html  css  js  c++  java
  • python 进程

    一、基础知识

    1、什么是进程

    进程:运行的程序
    2、进程和程序的区别
    进程:动态
    程序:静态
    3、进程的状态
    Ready Running Blocked
    4、进程的生命周期
    结束标志
    子进程:子进程的代码执行结束
    主进程:主进程的代码执行结束
    子进程的主进程:子进程的执行时间大于主进程,子进程执行结束
                               主进程的执行时间大于子进程,主进程执行结束
    5、同步/异步/阻塞/非阻塞
    同步:串行
    异步:并行
    阻塞:input time.sleep()等
    非阻塞:没有阻塞

    二、开启进程

    父进程和子进程有独立的内存空间,互不干涉
    子进程与子进程之间也各有独立的内存空间,互不干涉

    """
    同步
    函数和程序的PID一致
    """
    import os
    
    
    def test():
        print('Hello World!')
        print('How are you?')
        print('函数的PID %s' % os.getpid())
    
    
    test()
    print('fine')
    print('这个程序的PID %s' % os.getpid())
    """
    Hello World!
    How are you?
    函数的PID 260
    fine
    这个程序的PID 260
    """
    # 异步
    # 将函数变成子进程
    from multiprocessing import Process
    
    
    def test():
        print('Hello, World!')
        print('I like money......')
    
    
    # Windows系统执行进程必要条件
    if __name__ == '__main__':
        p = Process(target=test)    # 注册(实例化对象)
        p.start()   # 开启子进程 进程的执行:Ready->Running->Block->Ready
        print('abc')
    """
    结果:
    abc
    Hello, World!
    I like money......
    """
    # 异步,进程
    # 查看进程的子进程
    from multiprocessing import Process
    import os
    import time
    
    
    def test():
        print('你好')
        print('子进程的PID:%s' % os.getpid())
    
    
    if __name__ == '__main__':
        p = Process(target=test)
        p.start()
        print('How are you?')
        time.sleep(5)   # 子进程执行完后,再执行下面的语句
        print('父进程的PID:%s' % os.getpid())
    
    """
    结果:
    How are you?
    你好
    子进程的PID:13852
    父进程的PID:8180
    """
    """
    传递参数
    查看子进程,子进程的父进程
    查看父进程,父进程的父进程
    """
    from multiprocessing import Process
    import os
    
    
    def test(args):
        print('Are you ok? 演唱者: {}'.format(args))
        print('子进程的PID: %s' % os.getpid())
        print('子进程的父进程的PID: %s' % os.getppid())
    
    
    if __name__ == '__main__':
        p = Process(target=test, args=('雷军', ))     # 传递参数,args=tuple
        p.start()
        print('父进程的PID: %s' % os.getpid())
        print('父进程的父进程: {}'.format(os.getppid()))
    """
    结果:
    父进程的PID: 13568
    父进程的父进程: 3352
    Are you ok? 演唱者: 雷军
    子进程的PID: 6148
    子进程的父进程的PID: 13568
    """

     三、开启多进程

    1、创建多个对象

    2、使用for循环

    # 创建多个子进程
    # 子进程之间是异步,互不干扰,都有独立的内存空间
    from multiprocessing import Process
    import time
    
    
    def test(args1):
        time.sleep(2)
        print(args1)
    
    
    def test2(args1):
        print(args1)
    
    
    if __name__ == '__main__':
        p = Process(target=test, args=('joker', ))
        p.start()
        p1 = Process(target=test2, args=('loss', ))
        p1.start()
    
    """
    结果:
    loss
    joker
    """
    # 使用for循环,创建多个子线程
    # 子线程之间是异步,都有独立的内存空间,互不干涉,互不影响
    from multiprocessing import Process
    
    
    def for_fun(args):
        print('*'*args)
    
    
    if __name__ == '__main__':
        for i in range(1, 5):
            p = Process(target=for_fun, args=(i, ))
            p.start()
    """
    结果:
    **
    *
    ***
    ****
    """

    四、join()

    作用:人为控制,运行完子进程后,运行父进程,把子进程和父进程从异步->同步

    import os
    from multiprocessing import Process
    
    
    def test(args1):
        print('Hello {}'.format(args1))
        print('子进程的PID: %s' % os.getpid())
        print('子进程的父进程PID: {}'.format(os.getppid()))
    
    
    if __name__ == '__main__':
        p = Process(target=test, args=('tom', ))
        p.start()
        p.join()        # join()方法,察觉子进程结束,异步->同步
        print('父进程的PID: %s' % os.getpid())
        print('父进程的父进程PID: {}'.format(os.getppid()))
    """
    结果:
    Hello tom
    子进程的PID: 15772
    子进程的父进程PID: 7320
    父进程的PID: 7320
    父进程的父进程PID: 14600
    """
    # 子线程执行完毕后,再执行父线程
    # 子线程异步,所有子线程与父线程同步
    from multiprocessing import Process
    
    
    def test(args1):
        print('*'*args1)
    
    
    li_p = []
    if __name__ == '__main__':
        for i in range(1, 5):
            p = Process(target=test, args=(i, ))
            li_p.append(p)
            p.start()
        [i.join() for i in li_p]
        print('+++++++++++++++++++')

     五、面向对象创建进程

    """
    1.自定义类,继承Process
    2.初始化__init__()方法,并继承父类,目的传递参数
    3.run()方法,内部填写子进程执行的代码
    4.实例化对象,通过自定义类
    """
    import time
    from multiprocessing import Process
    
    
    class MyProcess(Process):
        def __init__(self, args1):
            super(MyProcess, self).__init__()
            self.args1 = args1
    
        def run(self) -> None:
            print('你好, %s' % self.args1)
            time.sleep(2)
            print('Hello')
    
    
    if __name__ == '__main__':
        p = MyProcess('tom')
        p.start()
        print('abc')
        # p.join()
        print('只要坚持住,老子天下无敌!!!')
    """
    结果:
    abc
    只要坚持住,老子天下无敌!!!
    你好, tom
    Hello
    """
    from multiprocessing import Process
    
    
    class MyProcess(Process):
        def __init__(self, args1):
            super(MyProcess, self).__init__()
            self.args1 = args1
    
        def run(self) -> None:
            print('*'*5*self.args1)
    
    
    if __name__ == '__main__':
        list_p = []
        for i in range(2, 6):
            p = MyProcess(i)
            list_p.append(p)
            p.start()
        [i.join() for i in list_p]
        print('+++++++++++++++++++++++++++++')
    """
    结果:
    **********
    ********************
    ***************
    *************************
    +++++++++++++++++++++++++++++
    """

    self.pid()  当前进程的PID值

    sel.name()  当前进程的名字

    from multiprocessing import Process
    
    
    class MyProcess(Process):
        def __init__(self):
            super(MyProcess, self).__init__()
    
        def run(self) -> None:
            print(self.pid)     # 获取该子进程的PID值
            print(self.name)    # 获取该子进程的进程名
    
    
    if __name__ == '__main__':
        for i in range(3):
            p = MyProcess()
            p.start()
    
    """
    结果:
    916
    MyProcess-3
    4864
    MyProcess-1
    15140
    MyProcess-2
    """
  • 相关阅读:
    模板
    模板
    模板
    模板
    2017-2018 ACM-ICPC Asia Tsukuba Regional Contest
    牛客
    软件工程
    Codeforces Round 696(Div.2)
    Atcoder ARC111 contest
    Codeforces Educational Round 100(Div.2)
  • 原文地址:https://www.cnblogs.com/wt7018/p/11042642.html
Copyright © 2011-2022 走看看