zoukankan      html  css  js  c++  java
  • 多进程,并行等

    使用multiprocessing模块创建子进程有两种方法

    1.用Process类创建子进程对象,然后用start()方法调用

    from multiprocessing import Process
    import time
    
    def task():
        print('son run')
        time.sleep(5)
        print('son over')
    
    
    if __name__ == '__main__':
        p=Process(target=task)  创建子进程对象参数target=函数名
        time.sleep(1)    
        p.start()      调用子进程对象
        time.sleep(2)
        print('over')

    ==》son run
      over
      son over


    2.创建父类为Process的类,在自定义的类中创建一个run方法,生成自定义类的对象为进程对象

    class Myprocess(Process):
        def __init__(self,name,s):  需要传入的参数可以根据需求设置
            super().__init__()
            self.name=name
            self.s=s
        def run(self):    run方法会自动被作为进程程序调用
            print('%s run'%self.name)
            time.sleep(self.s)
            print('%s over'%self.name)
    
    
    
    if __name__ == '__main__':
        p=Myprocess('aaa',1)
        p1=Myprocess('bbb',3)
        p.start()
        p1.start()

    ==》bbb run
      aaa run
      aaa over
      bbb over


    注意

    运行子进程需要在if __name__ == '__main__':包裹下才能正常运行
    创建的进程必须通过start方法来调用才会开始运行,也就是说子啊不被调用的情况下就

    不会被执行

    进程内存相互隔离

    父进程和子进程在运行中内存是被隔离开的,不同的进程在运行时会被放在单独的内存中空间中运行

    n=10
    def fun():
        n=0
        print('son:n=%s'%n)
    
    
    if __name__ == '__main__':
        p=Process(target=fun)
        print('far:n=%s'%n)
        p.start()

    ==》far:n=10
      son:n=0


    Prscess常用方法和属性

    p.join() 用来等待子进程结束
    class Myprocess(Process):
        def __init__(self,name):
            super().__init__()
            self.name=name
    
        def run(self):
            print('%s run'%self.name)
            time.sleep(2)      测试:子进程运行需要2-3秒
            print('%s over'%self.name)
    
    
    
    if __name__ == '__main__':
        p=Myprocess('aaa')
        p.start()
        p.join(3)         join参数中传入等待时间,单位是秒
        print('start')

    ==》
    aaa run
    aaa over
    start
    等待是让父进程等待子进程,等待适当的时间让子进程完成运行

    p.terminate() # 终止进程
    print(p.name) # 进程的名称
    print(p.is_alive()) #是否存活
    p.terminate() # 与start一样 都是给操作系统发送指令 所以会有延迟

    print(p.pid)  查看父进程编号
    print(p.exitcode) # 获取退出码

     阻塞,非阻塞

    阻塞是指程序运行中遇到io操作 例如(本地io):input,sleep,print,read 等(网络io):recv,send,accept等会进入阻塞状态

    非阻塞: 程序正常运行中 没有任何IO操作 就处于非阻塞状态

    并行,并发

    并行是指多个任务同时进行,必须有多核cpu才可以并行,也就是说并行依赖于cpu的多线程

    并发可以说是伪并行,多个程序看起来是在同时运行但是实际上一个运算核心在多个任务之间快速切换来处理任务。

    僵尸进程和孤儿进程

    僵尸进程:值得是,子进程已经结束了,但是操作系统会保存一些进程信息,如PID,运行时间等,此时这个进程就称之为僵尸进程

    僵尸进程如果太多将会占用大量的资源,造成系统无法开启新新进程,linux 中有一个wai/waitpid 用于父进程回收子进程资源

    孤儿进程:

    指的是,父进程先结束 ,而子进程还在运行着,

    孤儿进程无害,有 其存在的必要性,孤儿进程会被操作系统接管

  • 相关阅读:
    Wiin10 深色模式 暗色 省电 经济 护眼dark mode energy saving ecol
    云主机终端现实中文
    systemctl enable与systemctl start的区别
    centos技巧
    用国内的vps登录亚马逊的ec2
    小米 redmi note 8 打开开发者选项
    javascript数组、对象和Null的typeof同为object,区分解决办法
    组件中是否可以判断slot是否有内容?
    xlsx-style 行高设置
    修改xlsx-style 源码 解决报错
  • 原文地址:https://www.cnblogs.com/duGD/p/10957512.html
Copyright © 2011-2022 走看看