进程 守护

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

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

并发: 微观上依次执行, 宏观上在同时执行, 同一时刻只有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()  #最后两个二选一

 

 

posted @ 2018-12-07 16:51  追风zz  阅读(156)  评论(0编辑  收藏  举报