python第三十四天,进程,多进程,进程与程序的区别,程序运行的三种状态,multiprocessing模块中的Process功能,和join函数,和其他属性,僵尸与孤儿进程

1.进程

什么是进程:

  一个正在被运行的程序就称之为进程,是程序具体执行的过程,是一种抽象概念,进程来自操作系统

2.多进程

 多个正在运行的程序

在python中实现多线程的方法

from multiprocessing import Process
import os
import time


# 当出现一些耗时时间比较长的操作时,会导致程序进入阻塞状态,无法执行其他代码
# 这个时候就可以开启子进程把任务交给他


def task(name):
    print('name%s子进程开始!'% name)
    print('name%s子进程结束!'% name)

if __name__ == '__main__':
    p = Process(target=task,args=('大哥',))

    # 开启子进程,本质是向操作系统发送请求,让它启动进程,通常不可能立即开启
    p.start()
    p.join()
    print('父进程结束')

'''
PS:windows 和 linux 开启进程的方式不同
相同之处:都是需要将数据copy一份给子进程,这样  子进程才知道要干什么
linux 会将父进程的所有数据 完全copy,然后拿到父进程,知道代码的位置,继续执行
windows 会copy 一部分数据  同时会导入py文件来执行,这样一来就会递归开启进程
所以windows中开启子进程都需要开启判断

不过都建议加上判断,可以保证两个平台都可以使用

记住:
开启进程的代码,都把它放到 if __name__ == '__main__': 中即可
'''

3.进程与程序的区别

程序就是一堆计算机可以识别文件,程序在没有被运行就是躺在硬盘上的一堆二进制

运行程序时,要从硬盘读取数据到内存中,CPU从内存读取指令并执行 ,

一旦运行就产生了进程

一个程序可以多次执行 产生多个进程,但是进程之间相互独立

当我们右键运行了一个py文件时 ,其实启动的是python解释器,你的py文件其实是当作参数传给了解释器

4.程序运行的三种状态

1. 阻塞与非阻塞

  阻塞:当程序遇到IO操作(输入输出)时,就进入了阻塞状态

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

阻塞与非阻塞说的是程序运行状态

2.并发

  同一时间段,有多个程序都处于运行状态,但一个时间点只有一个程序被CUP处理,本质上切换执行,切换的同时,保存上一个任务的操作

3.并行

  同一时间段,多个任务同时被CUP处理

并发与并行说的是任务的处理方式

    PS:关于程序员永恒的话题  

      提高效率

      根本方法就是让程序尽可能处于运行状态

      减少IO 尽可能多占用CPU时间

      缓冲区就是用于减少IO操作的

5.miltiprocessing模块的使用(Process常用方法,join函数,)

#  Process其他使用方法

from multiprocessing import Process
def task():
    print('121212')
    exit(100)  # 退出码

if __name__ == '__main__':
    p = Process(target=task,name='李果')
    p.start()       # 此处名为懒加载优化机制,如果没有调用start ,那么该对象将不会被创建
    p.join()        # 等待子进程结束
    p.terminate()   # 终止进程
    print(p.is_alive())  # 判断进程是否存活
    print(p.pid)         # 查看PID
    print(p.exitcode)    # 获取退出码
import time
from multiprocessing import Process

def stak(i):
    print('买烟去了')
    time.sleep(i)
    print('%s 买完了!'% i)

if __name__ == '__main__':
    strat_time = time.time()
    p1 = Process(target=stak,args=(1,))
    p2 = Process(target=stak,args=(2,))
    p3 = Process(target=stak,args=(3,))

    # strat() 是同时进行的
    p1.start()
    p2.start()
    p3.start()

    # join等待的顺序是根据子进程工作结束的顺序来定的
    p1.join()
    p2.join()
    p3.join()


    end_time = time.time()
    print(end_time - strat_time)
    print('over')

6.僵尸与孤儿进程

孤儿进程:

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

孤儿进程无害,有 其存在的必要性

例如:qq开启了浏览器,qq先退出了 浏览器应该继续运行

孤儿进程会被操作系统接管

僵尸进程:

 

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

 

僵尸进程如果太多将会占用大量的资源,造成系统无法开启新新进程

 

linux 中有一个wai/waitpid 用于父进程回收子进程资源

 

python会自动回收僵尸进程

 

 

 

猜你喜欢

转载自www.cnblogs.com/liguodeboke/p/10957254.html