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)))
原文地址:https://www.cnblogs.com/fengxb1213/p/12691634.html