进程之间数据相互隔离,线程之间数据相互共享

多任务

并发:在一段时间内交替执行任务

并行:在一段时间内真正同时一起执行多个任务

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("主进程执行完毕")