zoukankan      html  css  js  c++  java
  • 进程 守护

    进程:  正在运行的程序(任务)   是计算机中最小的资源分配单位

      进程调度:--先来先服务调度算法,短作业优先,时间片轮转法,多级反馈队列

    并发: 微观上依次执行, 宏观上在同时执行, 同一时刻只有1个cpu在工作

    并行: 同一时刻不只1个cpu在工作 微观上就是同时执行多程序的

    同步:  程序顺序执行,多个任务之间串行执行 (洗衣完--做饭完--洗碗)

    异步:  多个任务同时运行  (在同一时间内洗衣做饭洗碗)

    I/O操作:

      input: 输出到内存 read load recv recvfrom accept input

      output: 从内存输出 write dump send sendto connect print

    阻塞: recv recvfrom accept 

      程序由于不符合某个条件或者等待某个条件满足 而在某一个地方进入等待状态

    非阻塞:

      sk.setblocking(Fasle)就让这个socket模型不阻塞了

    multiprocess模块

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

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

    p.start():启动进程,并调用该子进程中的p.run() 
    p.run():   进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法  
    p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法
              需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁 p.is_alive(): 如果p仍然运行,返回True p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。
               timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
    在Windows操作系统中由于没有fork(linux操作系统中创建进程的机制),在创建子进程的时候会自动 import 启动它的这个文件,
    而在 import 的时候又执行了整个文件。因此如果将process()直接写在文件中就会无限递归创建子进程报错。
    所以必须把创建子进程的部分使用if __name__ ==‘__main__’ 判断保护起来,import 的时候 ,就不会递归运行了。
     
    import time
    from multiprocessing import Process
    #通过并发实现一个有并发效果的socket server
    def son_process():  #子进程
        print('son kaishi')
        time.sleep(1)
        print('son end')
    if __name__ == '__main__':
        p = Process(target=son_process) #函数名   创建子进程 先执行子进程要执行的代码
        p.start()    #实例化的对象执行方法  通知操作系统开启一个子进程
        print('主进程')
    
    非阻塞
    #结果:
    #主进程
    #son kaishi
    #son end  
    守护进程
    # 每隔1分钟主动汇报当前程序状态
    def alive():
        while True:
            print('连接监控 汇报信息')
            time.sleep(0.6)
    def func():
        #核心代码
        while True:
            print('选择项目')
            time.sleep(1)
            print('根据选择做出对应操作')
    if __name__ == '__main__':
        p = Process(target = alive)
        p.daemon = True  #子进程 设置为 守护进程 守护进程会随着主进程代码的结束而结束
        p.start()
        p = Process(target=func)
        p.start()
        p.join() #在主进程中等待子进程结束 守护进程就可以守护其他子进程了
    # 守护进程
    # 1.守护进程会等待主进程的代码结束而结束,不会等待其他子进程的结束
    # 2.要想守护进程等待其他子进程,只需要在主进程中加上join
    操作多个子进程的结束和join阻塞
    for i in range(5):
        pass
    print(i)  # i=4
    lst = []
    for i in range(5):
        p = Process()
        lst.append(p)
        p.start()
    for p in lst:
        #p.join()
        p.terminate()  #最后两个二选一

     

  • 相关阅读:
    Revolving Digits[EXKMP]
    字符加密Cipher(bzoj 1031)
    Hotaru's problem
    1089 最长回文子串 V2(Manacher算法)
    3172: [Tjoi2013]单词
    3689: 异或之
    3942: [Usaco2015 Feb]Censoring [KMP]
    2795: [Poi2012]A Horrible Poem
    GT考试(bzoj 1009)
    NOIP2016提高组解题报告
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10083815.html
Copyright © 2011-2022 走看看