1、概念解释
多道技术
时间上的复用和空间上的复用
进程和程序的区别
程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。
并行和并发的区别
同步和异步,阻塞和非阻塞
同步:
就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。
异步:
当一个异步功能调用发出后,调用者不能立刻得到结果。当该异步功能完成后,通过状态、通知或回调来通知调用者。
阻塞:
阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
非阻塞:
指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程。
2、实操
(1)起进程的两种方法
注意: 在windows中Process()必须放到# if name == ‘main’:下
第一种:直接调用
from multiprocessing import Process
import time
def func(name):
print(f'{name} 正在编程')
time.sleep(3)
print(f'{name} 编程结束了')
if __name__ =='__main__':
print('主进程开始')
p1=Process(target = func,args=('youyou',))
p1.start() #主进程和子进程是异步的,
print('主进程结束')
输出:
主进程开始
主进程结束
youyou 正在编程
youyou 编程结束了
Process finished with exit code 0
第二种:类继承的方式
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self,name):
super(MyProcess, self).__init__()# 把父类重用一下
self.name = name
def run(self):
print(f'{self.name} 开始编程了')
time.sleep(3)
print(f'{self.name} 结束编程了')
if __name__ == '__main__':
print('主进程开始')
p = MyProcess('youyou')
p.start()
print('主进程结束')
输出:
主进程开始
主进程结束
youyou 开始编程了
youyou 结束编程了
Process finished with exit code 0
(2)进程的常用属性
from multiprocessing import Process
def func():
print('this is func')
if __name__ =='__main__':
p = Process(target= func)
p.pid # 进程的pid
p.daemon = True # 设置p为守护进程,守护进程在主进程结束后立即销毁,b不能在创建自己的子进程
p.start()
p.join # 父进程会等待p进程执行完成之后再继续往下执行
p.is_alive() # 返回键True 或者False,表示这个进程是否结束
p.terminate() # 结束p进程,不会立即结束,而是等待操作系统回收