进程之间数据相互隔离,线程之间数据相互共享
多任务
并发:在一段时间内交替执行任务
并行:在一段时间内真正同时一起执行多个任务
A---->B 并发,交替执行任务
|--->C
|--->D
A--->B 并行,真正的同时执行多个任务
C--->D
并行和并发并不冲突,并发针对单核,并行针对多核
单核CPU只能并发,多核CPU可以并行
并行是多任务,并发也是
多任务能够充分利用CPU资源,提高程序执行效率
进程
CPU分配资源的最小单位,操作系统进行资源分配和调度运行的最小单位
一个正在运行的程序就是一个进程
进程类实例化创建进程对象:
multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={})
参数:
group未使用,target表目标函数,name表进程名字,args填入目标函数参数(位置参数),kwargs填入目标函数参数(关键字参数)
进程编号
进程编号唯一标识一个进程,进程编号可以重复使用
获取进程编号的目的是验证主进程和子进程的关系,得知子进程是由哪个主进程创建出来
获取当前进程编号,获取当前父进程编号
获取当前进程编号os.getpid(),multiprocessing.current_process.pid
获取父进程编号os.getppid()
进程注意点:
1,进程之间不共享全局变量
import multiprocessing
import time
lst=[]
def write_data():
for i in range(3):
lst.append(i)
print('add:',i)
print('write:',lst)
def read_data():
print("read_data",lst)
print("我是main外资源") #执行3次
if __name__=='__main__':
write_process=multiprocessing.Process(target=write_data)
read_process=multiprocessing.Process(target=read_data)
write_process.start()
time.sleep(1)
read_process.start()
print("我是main内资源") #执行一次在这份代码中,write_process写入数据的时候,read_process进程读取数据时不会读到write_process写入的数据
是因为子进程的创建是对主进程资源的拷贝,write_process和read_process各拷贝一份,所以write_process进程修改并不会改变read_process进程的全局变量
write_process进程,read_process进程,甚至main主进程,这三者在执行时会同时创建出进程栈,子进程会对父进程进行拷贝操作
主进程的进程栈称为主进程栈,其他进程的进程栈称为自定义线程栈
输出
add: 0
add: 1
add: 2
write: [0, 1, 2]
read_data []2,主进程会等待所有子进程结束再结束
常用方式:守护进程,关键字:daemon
import multiprocessing
import time
def work():
for i in range(10):
print("工作中")
time.sleep(0.2)
if __name__ == '__main__':
work_process = multiprocessing.Process(target=work)
work_process.daemon=True
work_process.start()
time.sleep(1)
print("主进程执行完毕")