zoukankan      html  css  js  c++  java
  • python学习Day35--进程

    一、回顾

    1、编程语言的发展

      机器语言:二级制

      汇编语言:指令,命令形式

      高级语言:面向过程(C),面向对象(python)

    2、操作系统的目标:

      为了用户更方便的使用。

    3、并行与并发:

      并行:指两件或多件事情,在同一时间点同时执行

      并发:指两件或多件事情,在同一时间间隔内同时执行

    4、计算机组成

      CPU,主板,存储,输入,输出

    5、进程由三部分组成

      代码段、数据段、PCB(进程控制块)

    6、进程的三个基本状态

      就绪状态:获得了除CPU之外运行需要的所有资源

      执行状态:获得了所有资源,处于正在执行的状态

      阻塞状态:因为各种原因,导致进程放弃了CPU,导致进程无法继续执行,此时进程处于内存

    7、为什么要有操作系统?

    (1)封装了所有硬件的接口,使用户更方便的使用

    (2)对于计算机内所有资源,进行一个合理的调度和分配

    二、进程学习

    1、进程三状态转换图

    2、同步与异步

      所谓同步就是一个任务需要依赖另一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要目成功都成功,失败都失败,两个任务的状态可以保持一致。

      所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。

    3、同步/异步与阻塞/非阻塞

    (1)同步阻塞形式

    (2)异步阻塞形式

    (3)同步非阻塞形式

    (4)异步非阻塞形式

    4、多进程的开启

    (1)如何开启多个不同的子进程?

     1 from multiprocessing import Process
     2 import time
     3 import os
     4 
     5 
     6 def func(n):
     7     time.sleep(2)
     8     print('这里是儿子%s进程,儿子的pid是:%s,父进程的pid是:%s' % (n,os.getpid(),os.getppid()))
     9 
    10 if __name__ == '__main__':
    11     for i in range(2):
    12         p = Process(target=func,args=(i,)) # 实例化一个进程对象
    13         p.start() # 开启进程
    14     print('这里是父亲的进程,父亲的pid是:%s'% (os.getpid()))
    15     
    16 '''
    17 这里是父亲的进程,父亲的pid是:26920
    18 这里是儿子0进程,儿子的pid是:14480,父进程的pid是:26920
    19 这里是儿子1进程,儿子的pid是:21424,父进程的pid是:26920
    20 '''

    (2)以继承的方式开启子进程

     1 # *******************以继承的方式开启子进程**********************开始
     2 from multiprocessing import Process
     3 
     4 class MyProcess(Process):
     5     def __init__(self,name):
     6         self.name = name
     7         super(MyProcess,self).__init__(name=self.name)
     8 
     9     def run(self):
    10         print("这是以继承类的方式开启的子进程,他的名字是:%s" % self.name)
    11 
    12 if __name__ == '__main__':
    13     p = MyProcess('alex')# 实例化一个进程对象
    14     p.start() # 指解释器告诉操作系统,去帮我开启一个进程     就绪状态
    15     # p.run()  # 告诉操作系统,现在马上帮我执行这个子进程    执行状态
    16 # *******************以继承的方式开启子进程**********************结束

    【注意】开启一个正常的子进程,父进程会等待子进程结束后,父进程也就是程序才结束。

    【注意】p.join( )的作用,主进程执行这个,就会变成同步形式;若不执行这个,就是异步形式。

        join( )必须放在start后面。

    1 p = MyProcess('alex')# 实例化一个进程对象
    2 p.start() # 指解释器告诉操作系统,去帮我开启一个进程     就绪状态
    3 p.join() # 是让主进程等待子进程执行完毕。
    4 time.sleep(1)
    5 print('粑粑在这里')

    5、进程的其他常用

     1 from multiprocessing import Process
     2 import time
     3 
     4 def func():
     5     time.sleep(1)
     6     print(123)
     7 
     8 if __name__ == '__main__':
     9     p = Process(target=func,)
    10     p.start()
    11     p.terminate()# 杀死p进程,让解释器告诉操作系统,请杀掉p进程。
    12     print('子进程是否还活着?', p.is_alive())
    13     time.sleep(0.002)
    14     print('子进程是否还活着?', p.is_alive())
    15     # 返回一个bool值,如果返回True,代表进程还活着,如果返回False,代表子进程死了
    16 
    17 # p.is_alive() 判断p进程是否还活着
    18 # p.terminate() 杀死p进程

     6、进程的常用属性

    (1)守护进程:将子进程设置为守护进程,主进程结束后,子进程也随之结束。

     1 from multiprocessing import Process
     2 import time
     3 
     4 def func():
     5     time.sleep(100)
     6     print('这里是儿子哦')
     7 
     8 if __name__ == '__main__':
     9     p = Process(target=func)
    10     p.daemon = True # 将p进程设置为守护进程,必须要在start之前设置
    11     p.start()
    12     time.sleep(1)
    13     print('这是爸爸')
    14 总结一下:
    15     守护进程:跟随着父进程的代码执行结束,守护进程就结束

    守护进程的用法:(计时)

     1 from multiprocessing import Process
     2 import time
     3 
     4 
     5 def func():
     6     for i in range(10):
     7         time.sleep(1)
     8         print(time.strftime('%H:%M:%S'))
     9 
    10 if __name__ == '__main__':
    11     p = Process(target=func)
    12     p.daemon = True # 将p进程设置为守护进程,必须要在start之前设置
    13     p.start()
    14     time.sleep(5)
    15     print('这是爸爸')

    (2)常用属性

     1 from multiprocessing import Process
     2 import os
     3 
     4 def func():
     5     print('这里是儿子,儿子的pid是%s'%(os.getpid()))
     6 
     7 if __name__ == '__main__':
     8     p = Process(target=func)
     9     p.start()
    10     p.name = 'alex'
    11     print('儿子的名字是%s'%p.name)
    12     print('儿子的pid是%s'%p.pid)
    13     print('儿子是不是守护进程?',p.daemon)

    7、总结

    (1)进程的两种开启方法

      ① p = Process(target=None,args(,))

      ② 自定义类,继承Process父类

    (2)进程的常用方法

      ① start()  开启一个进程

      ② join()    异步变同步

      ③ is_alive()  判断进程是否活着

      ④ terminate() 杀死进程

    (3)进程的常用属性

      ① p.name=         给进程一个名字

      ② p.pid               返回p进程的pid

      ③ p.daemon=True   将p进程设置为守护进程。

        守护进程两个特点:

          守护进程会随着父进程的iehu而结束;

          守护进程不能在创建子进程。

     8、多个子进程演示

     1 from multiprocessing import Process
     2 import time
     3 import random
     4 
     5 def func(i):
     6     print('我是%s'%i)
     7 
     8 
     9 if __name__ == '__main__':
    10     l = []
    11     addr = ['河南的','山东的','辽宁的','湖南的']
    12     for i in addr:
    13         p = Process(target=func,args=(i,))
    14         p.start()
    15         # p.join()
    16         l.append(p)
    17     [p.join() for p in l]
    18     time.sleep(1)
    19     print('我选%s'%(random.choice(addr)))
  • 相关阅读:
    linux openresty 安装(图文死磕)
    openresty lua 调试 (图文死磕)
    windows openresty 死磕:安装和启动脚本
    SpringBoot SpringCloud 热部署 热加载 热调试
    SpringCloud 亿级流量 架构演进
    Zuul 详解,带视频
    Zuul Swagger 整合
    时间序列分解-STL分解法
    ISLR系列:(4.3)模型选择 PCR & PLS
    ISLR系列:(4.2)模型选择 Ridge Regression & the Lasso
  • 原文地址:https://www.cnblogs.com/fengxb1213/p/12691634.html
Copyright © 2011-2022 走看看