博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
multiprocess模块
阅读量:4979 次
发布时间:2019-06-12

本文共 5515 字,大约阅读时间需要 18 分钟。

什么是进程

什么是进程

进程是计算机中的程序关于某数据集合一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程与进程之间数据隔离,执行过程异步

为什么会出现进程的概念

合理利用cpu,提高客户体验,多个进程是可以利用多个cpu的,可以实现并行的效果

进程的特征

动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。并发性:任何进程都可以同其他进程一起并发执行独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进结构特征:进程由程序、数据和进程控制块三部分组成。多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

进程与程序的区别

程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。

进程的调度

要想多个进程交替运行,操作系统必须对这些进程进行调度,这个调度也不是随即进行的,而是需要遵循一定的法则,由此就有了进程的调度算法

先来先服务调度算法

先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。 由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。

短作业优先调度算法

短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。 但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。

时间片轮转法

View Code

多级反馈队列

View Code

multiprocess.process模块

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

Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)强调:1. 需要使用关键字的方式来指定参数2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号参数介绍:group参数未使用,值始终为Nonetarget表示调用对象,即子进程要执行的任务args表示调用对象的位置参数元组,args=(1,2,'egon',)kwargs表示调用对象的字典,kwargs={
'name':'egon','age':18}name为子进程的名称

 

import osfrom multiprocessing import Processdef son_process():    '''这个函数中的代码是在子进程中执行的        getpid():查看当前进程的ID        getppod():查看父进程的ID        '''    print('执行我了',os.getpid(),os.getppid())if __name__ == '__main__': #此句话在mac或linux中不必写    #son_process 的外面是一个主进程    print('父进程',os.getpid()) p = Process(target=son_process) #target:表示调用对象,即进程要执行的任务 p.start() #启动进程,并调用改子进程中的p.run() 结果: 父进程 10020 执行我了 10416 10020

方法介绍

1. p.start():启动进程,并调用该子进程中的p.run() 2. p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法  3  p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁4  p.is_alive():如果p仍然运行,返回True5  p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程

属性介绍

1. p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置2. p.name:进程的名称3. p.pid:进程的pid4. p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)5. p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

在windows中使用process模块的注意事项

View Code

进程

开启一个子进程

1.开启了一个子进程就已经实现了并发: 父进程(主进程)和子进程并发(同时执行)def son_process():    print('son start')    time.sleep(1)    print('son end')if __name__ == '__main__':    p = Process(target=son_process)    p.start()    for i in range(5):        print('主进程')        time.sleep(0.3)

开启多个子进程

def son_process():    print('son start')    time.sleep(1)    print('son end')if __name__ == '__main__':    for i in range(3):        p = Process(target=son_process)

给子进程中传参数

def son_process(i):    print('son start',i)    time.sleep(1)    print('son end',i)if __name__ == '__main__':    for i in range(10):        p = Process(target=son_process,args=(i,))        p.start()  # 通知操作系统 start并不意味着子进程已经开始了

主进程和子进程之间的关系

def son_process(i):    print('son start',i)    time.sleep(1)    print('son end',i)if __name__ == '__main__':    for i in range(10):        p = Process(target=son_process,args=(i,))        p.start()    print('主进程的代码执行完毕')# 主进程会等待子进程结束之后才结束# 为什么?# 父进程负责创建子进程,也负责回收子进程的资源

主进程直接结束一个子进程

def son_process(i):    while True:        print('son start',i)        time.sleep(0.5)        print('son end',i)if __name__ == '__main__':    p = Process(target=son_process, args=(1,))    p.start()           # 开启一个子进程,异步的    print('主进程的代码执行完毕')    print(p.is_alive())  # 子进程还活着    p.terminate()        # 结束一个子进程,异步的    print(p.is_alive())  # 子进程还在活着    time.sleep(0.1)    print(p.is_alive())

开启十个进程执行

# 主进程里的print('主进程n : ',n)这句话在十个子进程执行完毕之后才执行n = [100]import randomdef sub_n():    global n  # 子进程对于主进程中的全局变量的修改是不生效的    time.sleep(random.random())    n.append(1)    print('子进程n : ',n)if __name__ == '__main__':    p_lst = []    for i in range(10):        p = Process(target = sub_n)        p.start()        p_lst.append(p)    for p in p_lst:p.join()  # 阻塞 只有一个条件是能够让我继续执行 这个条件就是子进程结束    print('主进程n : ',n)

join的扩展

n = [100]def sub_n():    global n  # 子进程对于主进程中的全局变量的修改是不生效的    n.append(1)    print('子进程n : ',n)    time.sleep(10)    print('子进程结束')if __name__ == '__main__':    p = Process(target = sub_n)    p.start()    p.join(timeout = 5)     # 如果不设置超时时间 join会阻塞直到子进程p结束    # timeout超时    # 如果设置的超时时间,那么意味着如果不足5s子进程结束了,程序结束阻塞    # 如果超过5s还没有结束,那么也结束阻塞    print('主进程n : ',n)    p.terminate()  # 也可以强制结束一个子进程

守护主进程

import timefrom multiprocessing import Processdef alive():    while True:        print('连接监控程序,并且发送报活信息')        time.sleep(1)def func():    '''主进程中的核心代码'''    while True:        print('选择的项目')        time.sleep(1)        print('选择后做的事情')        time.sleep(0.2)if __name__ == '__main__':    p = Process(target = alive)    p.daemon = True #设置子程序为守护程勋,守护进程会随着主进程代码的接结束而结束    p.start()    func()

设置子进程为守护进程,守护进程会随着主进程代码的结束而结束,由于主进程要负责给所有的子进程收尸,所有主进程必须是最后结束,守护进程只能在主进程大代码结束之后就认为主进程结束了,守护进程在主进程的代码结束之后就结束了,不会等待其他子进程结束

守护其他进程

import timefrom multiprocessing import Processdef alive():    while True:        print('连接监控程序,并且发送报活信息')        time.sleep(1)def func():    '''主进程中的核心代码'''    while True:        print('选择的项目')        time.sleep(1)        print('选择后做的事情')        time.sleep(0.2)if __name__ == '__main__':    p = Process(target = alive)    p.daemon = True #设置子程序为守护程勋,守护进程会随着主进程代码的接结束而结束    p.start()    p = Process(target=func)    p.start()    p.join() # 在主进程中等待子进程结束,守护进程就可以帮助守护其他子进程了

 

转载于:https://www.cnblogs.com/wanglan/p/10083741.html

你可能感兴趣的文章
安卓点击事件语法
查看>>
NOIP2012模拟赛第三弹
查看>>
7.22武汉日全食自拍留念
查看>>
[转帖]mimikatz 学习
查看>>
IIS 使用 HTTP重定向 修改 默认主页
查看>>
教程笔记《JavaScript深入浅出》
查看>>
MySQL——安装
查看>>
【转】移动端常用的四个框架
查看>>
[转载]delete指针之后应该赋值NULL
查看>>
thinkphp3.2导出
查看>>
OO第三阶段总结
查看>>
oracle分页查询
查看>>
windows rap环境搭建
查看>>
找出第3名学生的成绩
查看>>
[转载]typedef常见用法
查看>>
MVC我来了
查看>>
动态期末成绩
查看>>
如何判断用户是否是第一次进入应用程序(仿微信进入动画)
查看>>
2012.12.1 随笔
查看>>
JENKINS 打包发布脚本
查看>>