并发是任务数多于cpu核数,这样看起来是一起执行,其实切换比较快而已
并行就是任务数小于cpu核数,一起执行
单核其实就是类似于并发,一个一个切换的比较快,多核可以看成多个单核,类似操作。
调度算法:什么样的情况下让谁先执行,就是调度算法
进程:正在运行的代码
程序:编写完毕的代码,没有运行
进程的三个状态:就绪,运行,阻塞
———————————————————————————————————————————————
ret=os.fork() #创建一个子进程
主进程中ret>0,子进程中ret=0,有了os.fork就创造了一个子进程,下面的都执行。
当主进程退出就退出,不会因为子进程没结束就等他。只是因为加了一个os.fork(),主进程打印over了,子进程还是执行over
全局变量在一个进程中数据修改不能个改变另一个进程的数据
多次fork,如果是并列的就是2的n次方
和fork不一样的地方就是,fork,windows里面没有,所以要想创建一个进程就用from multiprocessing import Process
这时候把下面的while True删除了,主进程就会等待子进程结束在结束,而fork不会,两个没有影响
join会一直等到这个进程结束才会进行下一个进程,这个不结束就一直等
常用的Process方法
子类创建进程,用类来编写,继承Process类,可以有__init__,外部的start一定会调用run方法,所以是重写run方法
进程池,非堵塞方式,堵塞就把apply_async变成apply就是一个进程结束在执行另一个进程
apply是阻塞的,所以进入子进程执行后,等待当前子进程执行完毕,在继续执行下一个进程。
apply_async是非阻塞的,根据系统吊调度。
———————————————————————————————————————————————
进程间的通信
from multiprocessing import Process,Queue
q=queue()
q.put(0)
q.get()就是取出来并且读出来
q.qsize()判断里面有几个参数
q.full()判断队列满了没
q.empty()判断队列是不是空了
这个只能用作Process,如果要用到进程池的话需要from multiprocessing import Manager,Pool
初始化时候要p=Manager().Queue()