day33

  1. 了解

进程:进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。

将应用程序对硬件资源的静态请求变得有序化

'''
串行:一个完完整整的执行完了再执行下一个
并发:看起来是同时运行的
并行:真正做到了同时运行

多道技术(了解):
空间复用:共用一个内存条,每一个进程都有自己独立的内存空间,互不干扰,物理级别的隔离
时间复用:共用一个CPU

CPU切换(掌握)
io的时候,占用时间过长切换

'''

现代计算机:

'''
现在的主机一般是多核,那么每个核都会利用多道技术
有4个CPU,运行于CPU1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个
CPU中的任意一个,具体由操作系统调度算法决定
'''

并发:切换+保存状态

开启子进程:把父进程的代码完整复制到一个新的内存空间里去执行

x = 1
def task():
print(x)
2. 开启子进程的方式一

multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。

from multiprocessing import Process
import time

def task():
print('进程 start')
time.sleep(2)
print('进程 end')

if name == 'main': # 在windows中Process()必须放到if name == 'main':下
p = Process(target=task)
p.start() # 告诉操作系统我要开子进程,告诉完了这行代码就算执行完了,接着往下走,具体操作系统什么时候开子进程,开多长时间跟你没关系
time.sleep(5)
print('主进程/父进程')

开启多个子进程

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=('rocky',)) # 实例化得到的对象,表示一个子进程中的任务(尚未启动)
p2 = Process(target=task,args=('nick',)) # args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
p.start()
p2.start()
time.sleep(5)
print('主进程')
3. 开启子进程的方式二
from multiprocessing import Process
import time

class Test(Process):
def init(self,name): # 如果不传参没必要重写init
super().init()
self.name = name

def run(self):
    print(f'子进程{self.name} start')
    time.sleep(2)
    print('子进程 end')

if name == 'main':
p = Test('ys')
p.start() # 向操作系统发送开启子进程的请求
print('主进程')
4. 验证进程的内存空间隔离
from multiprocessing import Process
import time

x = 0
def task():
global x # 子进程修改的是自己的名称空间里的x,与主进程无关。
x = 100
print(f'子进程的x修改为了{x}')

if name == 'main':
p = Process(target=task)
p.start()
time.sleep(5)
print(x)
5. 测试
from multiprocessing import Process
import time

def task():
print('进程 start')
time.sleep(2)
print('进程 end')

if name == 'main':
p = Process(target=task)
p2 = Process(target=task)
p.start()
p2.start()
print('主进程')

'主进程在等待所有的子进程结束'

原文地址:https://www.cnblogs.com/bjlxxbj/p/11515061.html