小结
将应用程序对硬件资源的竞态请求变得有序化
串行:一个程序‘完完整整’的执行完了再执行下一个程序
并发:看起来是同时运行的,实际上不是 (切换+保存状态)
并行:真正做到了同时运行
多道技术:(了解)
-空间复用:共用一个内存条,每一个进程都有自己独立的内存空间,互不干扰,物理级别的隔离
-时间复用:共用一个CPU
cpu切换(掌握) :当进程遇 io 的时候或者占用时间过长,cpu会切换到下一个进程
现代计算机:
-现在的计算机一般书多核,那么每一个核都会利用多道技术
-有4个cpu,运行于CPU1的某个程序遇到 io 阻塞,会等到 io 结束再重新调度,会被调度到4个cpu中的任意一个,具体由操作系统调度算法决定
并发:切换+保存状态
坑 (如果没加 if _ _ name _ _ == '_ _main _ _', 会陷入递归)
开启子进程:把父进程的代码完整复制到一个新的内存空间里去执行
x =1
def task()
print(x)
createProcess(task)
开启子进程的方式一
#1. 导入模块 Process是一个类
from multiprocessing import Process
import time
def task():
print('进程 start')
time.sleep(2)
print('进程 end')
if __name__ == '__main__':
p=Process(target=task)
p.start()
time.sleep(5)
print('主进程')
开启子进程方式一——多个子进程
#1. 导入模块 Process是一个类
from multiprocessing import Process
import time
def task(x):
print(f'子进程{x} start')
time.sleep(2)
print(f'子进程{x} end')
if __name__ == '__main__':
p=Process(target=task, args=('Nick',))
p2=Process(target=task, args=('tank',))
p.start()
p2.start()
time.sleep(5)
print('主进程')
进程的执行顺序进度有操作系统控制(不是固定的)
开启子进程方式二
# 导入模块
from multiprocessing import Process
import time
# class Test(Process):
# #用类开启必须要继承Process这个类
# def run(self):
# print('子进程 start')
# time.sleep(2)
# print('子进程 end')
#
# if __name__ == '__main__':
# p=Test()
# p.start()
# time.sleep(5)
# print('主进程')
class Test(Process):
def __init__(self,name):
super().__init__() #如果不写这一句就是在重写父类中的__init__,运行程序会报错
self.name=name
def run(self):
print(f'子进程{self.name} start')
time.sleep(2)
print('子进程{self.end} end')
# p=Test('Nick')
# print(p.name) #Nick
if __name__ == '__main__':
p=Test('Nick')
p.start()
print('主进程')
验证进程的内存空间隔离
from multiprocessing import Process
import time
x = 0
def task():
global x #把x变成全局变量
x = 100
print('子进程的x修改为{}'.format(x))
if __name__ == '__main__':
p = Process(target=task)
p.start()
time.sleep(3)
print('主进程')
测试
from multiprocessing import Process
import time
def task():
print('子进程 start')
time.sleep(2)
print('子进程 end')
if __name__ == '__main__':
p = Process(target=task)
p1 = Process(target=task)
p.start()
p1.start()
time.sleep(5)
print('主进程')
'''主进程在等待所有的子进程结束
每一个进程都有一个pid,子进程结束后主进程可以立即对其进行回收,也可以等所有的子进程都结束后,主进程结束之前统一回收'''