标签:常用 lis 正在执行 span 观察 可靠 start process 踢出
2.计算机操作系统:
操作系统的作用:
2.进程:
3.进程三大部分组成:代码段,数据段,PCB:进程管理调度
4.进程的三大基本状态
同步:比如你去商店买书,你问老板有没有<古龙小说集>,老板说我给你查查,然后你就一直等,有可能等一天,有可能等一个小时,必须等到一个结果,你才去进行下一步;
异步:还是你去买书,你问老板有没有,老板说,你先回去吧,我帮你查查,有了电话通知你,你得到一个结果,可是这个结果并不是真实的结果,只是一个反馈结果而已;
阻塞:还是买书,你问老板有没有,老板说我帮你查查,然后你会一直在等,等到天荒地老,什么也不干,等一个结果;
非阻塞:还是买书,你问老板有没有,老板说我帮你查查,你说老板你先查着,我先玩一会,然后你一会在过来看看;
同步阻塞形式
效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。
异步阻塞形式
如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;
异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
同步非阻塞形式
实际上是效率低下的。
想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有(两个操作不能同时执行,因为是同步),如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。
异步非阻塞形式
效率更高,
因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。
比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。
1.进程两种开启方式:实例化一个进程的对象:
def func(): print(‘子进程1的爸爸是%s,我是%s‘ % (os.getppid(),os.getpid())) def func2(): print(‘子进程2的爸爸是%s,我是%s‘ % (os.getppid(), os.getpid())) if __name__ == ‘__main__‘: li = [func, func2] for i in li: p = Process(target=i) p.start() print(‘主进程的爸爸是%s,我自己是%s‘ % (os.getppid(),os.getpid())) #主进程的爸爸是1116,我自己是12760 子进程1的爸爸是12760,我是848 子进程2的爸爸是12760,我是11588
2.通过继承
class Myprocess(Process): def __init__(self,name): super(Myprocess, self).__init__() self.name = name def run(self): print(‘这是以继承类的方式开启的子进程%s,他的名字是%s‘ %(os.getppid(),self.name)) if __name__ == ‘__main__‘: p = Myprocess(‘alex‘) p.start() print(‘这里是主进程%s‘ % os.getpid())
3.进程的常用方法
每个方法的代码演示:
from multiprocessing import Process import time def func(): for i in range(500): time.sleep(0.01) print(‘儿子在这里‘) if __name__ == ‘__main__‘: p = Process(target=func) p.start() p.join()# 是让主进程等待子进程执行完。 现象:主进程执行到这句话,主进程阻塞住,等待子进程执行 for i in range(100): time.sleep(0.01) print(‘爸爸在这里‘) # 开启一个正常的子进程,父进程会等待子进程结束后,父进程也就是程序才结束 # p.join()# 是让主进程等待子进程执行完。 现象:主进程执行到这句话,主进程阻塞住,等待子进程执行 # 如何把父进程和子进程之间的关系变为同步或者异步? # 父进程执行join,就会变成同步,不执行join,父进程和子进程就是异步的关系 # join必须放在start()后边
from multiprocessing import Process import time def func(): time.sleep(1) print(123) if __name__ == ‘__main__‘: p = Process(target=func,) p.start() p.terminate()# 杀死p进程,让解释器告诉操作系统,请杀掉p进程。 print(‘子进程是否还活着?‘, p.is_alive()) time.sleep(0.002) print(‘子进程是否还活着?‘, p.is_alive()) # 返回一个bool值,如果返回True,代表进程还活着,如果返回False,代表子进程死了 # p.is_alive() 判断p进程是否还活着 # p.terminate() 杀死p进程
4.进程的常用属性
from multiprocessing import Process import time def func(): for i in range(10): time.sleep(1) print(time.strftime("%H:%M:%S")) if __name__ == ‘__main__‘: #设置为守护进程后,会根据主进程想要的效果停止的子进程 p = Process(target=func) p.daemon = True p.start() time.sleep(5) print(‘计时结束!‘) #输出结果 20:15:49 20:15:50 20:15:51 20:15:52 20:15:53 20:15:54 计时结束!
from multiprocessing import Process import time import os def func(): print(‘这里是儿子,儿子的pid是%s‘%(os.getpid())) if __name__ == ‘__main__‘: p = Process(target=func) p.start() p.name = ‘alex‘ print(‘儿子的名字是%s‘%p.name) print(‘儿子的pid是%s‘%p.pid) print(‘儿子是不是守护进程?‘,p.daemon)
标签:常用 lis 正在执行 span 观察 可靠 start process 踢出
原文地址:https://www.cnblogs.com/0627zhou/p/9507831.html