zoukankan      html  css  js  c++  java
  • day35-子进程的开启

    #1、异步非阻塞:
    import os
    from multiprocessing import Process
    def func():
        print('子进程:',os.getpid())
    
    if __name__ == '__main__':
        p = Process(target = func)    #创建一个进程对象。
        print('主进程:',os.getpid())
        p.start()                    #开启子进程,至于系统什么时候调度,不管它,先执行下面的代码,属于异步。
        print('主进程:',os.getpid())
    # 主进程: 14112
    # 主进程: 14112
    # 子进程:12860
    
    #2、同步非阻塞:
    import os
    from multiprocessing import Process
    def func():
        print('子进程:',os.getpid())
    
    if __name__ == '__main__':    #下面没有创建进程对象,只有一个进程,属于同步。
        print('去银行取钱')
        func()
        print('取完钱了')
    # 去银行取钱
    # 子进程: 5668
    # 取完钱了
    
    #3、异步阻塞:
    import os
    import time
    from multiprocessing import Process:
    def func():
        print('子进程:',os.getpid())
    
    if __name__ == '__main__':
        p = Process(target = func)
        print('主进程:',os.getpid())
        p.start()                   #开启子进程
        time.sleep(10)               #主进程阻塞10秒,跟子进程没关系,不影响子进程,属于异步阻塞。
    
    #4、同步阻塞:
    import os
    import time
    from multiprocessing import Process
    def func():
        print('子进程:',os.getpid())
    
    if __name__ == '__main__':
        print('去银行取钱')
        func()
        time.sleep(10)         #只有一个进程,阻塞10秒,属于同步阻塞。
        print('取完钱了')
    
    #5、父进程创建子进程:主进程和父进程的pid是一样的,说明它们是同一进程。主进程创建了子进程,也就是父进程创建了子进程。
    import os
    from multiprocessing import Process
    def func():
        print('子进程:',os.getpid())
        print('父进程:',os.getppid())
    
    if __name__ == '__main__':
        p = Process(target = func)
        p.start()
        print('主进程:',os.getpid())
    # 主进程: 16284
    # 子进程: 10972
    # 父进程: 16284
    
    #6、主进程控制子进程,主进程传参给子进程:
    import os
    from multiprocessing import Process
    def func(money):
        print('取%d元'%money)
    
    if __name__ == '__main__':
        p = Process(target = func,args = (8000000,)) #args是元祖
        p.start()
    #取8000000元
    
    #7、子进程优先执行,主进程阻塞:
    import os
    from multiprocessing import Process
    def func():
        print('子进程',os.getpid())
    
    if __name__ == '__main__':
        p = Process(target = func)
        p.start()
        p.join()                   #主进程等待子进程结束之后才结束,子进程执行,主进程阻塞在p.join()的位置
        print('主进程',os.getpid())
    #子进程 23080
    #主进程 10912
    
    #8、要求子进程重复三次,主进程最后才执行:
    import os
    from multiprocessing import Process
    def func():
        print("子进程",os.getpid())
    
    if __name__ == '__main__':
        p = Process(target = func)
        p1 = Process(target = func)
        p2 = Process(target = func)
        p.start()
        p1.start()
        p2.start()
        p.join()
        p1.join()
        p2.join()
        print('主进程',os.getpid())
    # 子进程 7436
    # 子进程 19988
    # 子进程 17712
    # 主进程 1464
    
    #9、如果子进程重复很多次,上面代码就很麻烦,要使用for循环解决:
    import os
    from multiprocessing import Process
    def func():
        print("子进程",os.getpid())
    
    if __name__ == '__main__':
        p_list = []
        for i in range(10):
            p = Process(target = func)
            p.start()
            p_list.append(p)
        for p in p_list:
            p.join()
        print('主进程',os.getpid())
    
    #10、多个子进程开始,是无法知道哪个先执行,没有顺序的。但是在p.start()后面加上p.join()可以让当前子进程优先执行,这样就有顺序了。
    import os
    from multiprocessing import Process
    def func(i):
        print('序号%d 子进程的pid是%d'%(i,os.getpid()))
    
    if __name__ == '__main__':
        for i in range(3):
            p = Process(target = func,args=(i,))
            p.start()
        print('主进程',os.getpid())
    # 主进程 1976
    # 序号0 子进程的pid是17912
    # 序号2 子进程的pid是15904
    # 序号1 子进程的pid是17612
    
    #11、多进程的特点:数据隔离。子进程之间的数据是隔离的,不共享,他们没有关系,互不影响。
    # 在windows下,每创建一个子进程,都会创建一个空间对当前模块(day35-子进程的开启.py)的代码执行一遍,
    # 所以每创建一个子进程,n都是等于100。
    from multiprocessing import Process
    n = 100
    def func(i):
        global n
        n = n - 1
        print(i,n)
    
    if __name__ == '__main__':
        for i in range(3):
            p = Process(target=func,args=(i,))
            p.start()
    # 0 99
    # 2 99
    # 1 99
    
    #12、使用子类继承父类的方式来开启子进程,并且传参:必须继承Process类和定义run方法。
    import os
    from multiprocessing import Process
    class MyProcess(Process):                #必须继承Process类。
        def __init__(self,args1,args2,args3):
            super().__init__()            #子类继承父类__init__方法里面的属性。
            self.args1 = args1
            self.args2 = args2
            self.args3 = args3
    
        def run(self):                        #必须定义一个run方法。
            print('子进程:',os.getpid(),self.args1,self.args2,self.args3)
            self.walk()            #调用walk方法,walk方法在子进程当中执行。
    
        def walk(self):
            print('子进程walk方法',os.getpid())
    
    if __name__ == '__main__':
        p = MyProcess(1,2,3)
        p.start()              #默认调用run方法。
        p.walk()                    #在主进程当中执行。
        print('主进程',os.getpid())
    # 子进程walk方法 756 #pid跟主进程的一样,证明在主进程当中执行。
    # 主进程 756
    # 子进程: 15124 1 2 3
    # 子进程walk方法 15124 #pid一样,证明walk方法在子进程当中执行。
  • 相关阅读:
    一则由表单提交引发的思考
    前端技术栈持续汇总中(已解锁)
    5599充值中心功能开发
    CSS动画持续汇总中
    编程小技巧持续汇总中
    开发软件安装方法汇总
    HashMap中tableSizeFor
    2019年JVM面试都问了什么?快看看这22道面试题!(附答案解析)
    Spring注解@EnableWebMvc使用坑点解析
    线程池中 work 为何要实现 AbstractQueuedSynchronizer
  • 原文地址:https://www.cnblogs.com/python-daxiong/p/12142696.html
Copyright © 2011-2022 走看看