知识回顾、进程的相关知识和操作

1、编程语言的发展:

  机器语言:二进制

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

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

2、操作系统的目标:

  为了使用户更方便的使用系统

3、计算机的组成:

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

4、并行、并发

  并发:指两件或多件事情,在同一时间间隔内同时执行(宏观上是并行,微观上是串行)

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

5、进程有三部分组成:

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

6、进程的三种基本状态:

  就绪状态:除了cpu之外,进程获得了需要的所有资源

  执行状态:进程获取了需要的所有资源正在执行

  阻塞状态:进程由于某些原因放弃了cpu,无法继续执行,此时进程在内存中处于等待状态

  

7、操作系统的介绍

  dos :单用户单进程

  Windows :单用户多进程(早起的Windows)

  unix :多用户用进程

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

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

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

9、多进程的模块

  multiprocessing

  Process

10、进程相关知识、操作

  1)同步、异步、阻塞、非阻塞

    同步:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;

    异步:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

    阻塞:做某件事情,直到完成,除非超时

    非阻塞:尝试做,如果不能做,就不做(直接返回),如果能做,就做。

    列子:小李喝了想喝水,于是去煮开水。
        1、小李把水壶放到炉子上,等待水烧开。(同步阻塞)
          小李感觉这样太费时间。
        2、小李把水壶放到炉子上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
          小李还是觉得自己这样太累,于是买了把会响笛的那种水壶。水开之后,能发出声音。
        3、小李把响水壶放到炉子上,等待水壶发出声音。(异步阻塞)
          觉得这样傻等意义不大
        4、小李把响水壶放到炉子上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
          这样真好。

  2)进程的两种开启方法:

    a、p = Process(target=None,args=(,)  target :是子进程要执行的任务,args:是父进程给子进程传递的参数

    b、自定义类,继承Process父类

  3)进程的常用方法

    a、start()  开启一个进程     底层调用的是p.run() 这个方法

    b、join()   异步变同步(就是让父进程停留在join这句话,等待子进程执行结束,父进程再继续执行)--->>>必须在start()后面

    c、is_alive()  判断进程是否活着

    d、terminate()  杀死进程

  4)进程的常用属性

    a、p.name =  name   给p进程一个名字

    b、p.pid                     返回p进程的pid(获取当前进程的pid-->os.getpid()    获取当前进程的父进程的pid---->os.getppid()  )

    c、p.daemon = True   将p进程设置为守护进程。(True为守护进程,False为普通进程)---->>>必须在start()前面

      守护进程的两个特点:

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

        守护进程不能再创建子进程

补充:1、多进程之间不能共享内存

   2、如何把父进程和子进程之间的关系变为同步或者异步?

      父进程执行join,就会变成同步(join必须放在start()后边),不执行join,父进程和子进程就是异步的关系

from multiprocessing import Process


def func(i):
    global n
    print(n) # 会报错,func函数的内存和if条件下的内存之间不能共享


if __name__ == '__main__':
    n = 100
    p = Process(target=func,args=(1,))
    p.start()

以下为一些操作的代码:

from multiprocessing import Process # 导入多进程模块
import time
import random


def func(i):
    time.sleep(1)
    print('我是%s' % i)


if __name__ == '__main__': # pycharm中运行必须这行代码必不可少
    l = []
    addr = ['太原的','长治的','吕梁的','运城的']
    for i in addr:
        p = Process(target=func,args=(i,)) # 实例化一个子进程对象并传递相应的参数
        p.start() # 开启子进程
        l.append(p)
        p.join() # 异步转成同步 (必须等待上一个执行完才能执行下一个)
    # [i.join() for i in l] # 与p.join()作用一样,但是它的速度比较快
    time.sleep(2)
    print('我选%s' % random.choice(addr))
##########################开启子进程的一种方式#####################
from multiprocessing import Process
import os
import time


def func(i):
    time.sleep(1)
    print('这里是子进程,子进程的pid是%s,子进程的父进程的pid是%s' %(os.getpid(),os.getppid()))


if __name__ == '__main__':
    for i in range(2):
        p = Process(target=func,args=(i,))
        p.start()
    print('这里是父进程,父进程的pid是%s,父进程的父进程的pid是%s' % (os.getpid(),os.getppid()))

####################开启子进程的另外一种方式,以继承的方式###################
class MyProcess(Process):
    def __init__(self,name):
        super(MyProcess, self).__init__()
        self.name = name
    def run(self):
        print('这里以继承类的方式开启的子进程,它是%s' % self.name)

if __name__ == '__main__':
    p1 = MyProcess('guo')
    p1.start() # 解释器告诉操作系统,去帮我开启一个子进程   就绪状态(start会自动调用MyProcess中的Run方法)
    # p1.run() # 告诉操作系统,现在马上帮我执行这个子进程    执行
##########杀死子进程##############
from multiprocessing import Process
import time


def func():
    print(123)

if __name__ == '__main__':
    p = Process(target=func,)
    p.start()
    time.sleep(0.15) # 0.1不打印123,0.2都是False了,比较完美的结果了
    p.terminate() # 杀死p进程
    print('子进程是否还活着?',p.is_alive()) # is_alive()返回一个bool值,True就代表活着,否则就代表死了
    time.sleep(1)
    print('子进程是否还活着?',p.is_alive())

# 打印结果:
#123
#子进程是否还活着? True
#子进程是否还活着? False
####################守护进程####################
from multiprocessing import Process
import time


def func():
    for i in range(10):
        time.sleep(1)
        print('子进程%s'% time.strftime('%H:%M:%S'))


if __name__ == '__main__':
    p = Process(target=func)
    p.daemon = True # 将p进程设置为守护进程,必须要在start之前设置(会随着父进程的结束而结束)
    p.start()
    time.sleep(5) # 只会产生4个子进程的结果
    print('父进程')

猜你喜欢

转载自www.cnblogs.com/wjs521/p/9508266.html