一、fork模块
1、fork存在于系统os模块中,只在Unix、Linux、Max上运行,windows不可以,平时几乎不用
2、创建:pid = os.fork()
3、在创建多个进程时以裂变的形式创建2的幂次方个子进程
类似于:
(1)父亲创建儿子1
(2)父亲创建儿子2,儿子1创建孙子1(这个时候就有四个进程)
4、进程之间互不干扰,包括全局变量的值,主进程或子进程结束时不会影响其他进程
5、父子进程执行顺序没有规律,完全取决于操作系统的调度算法
二、 multiprocessing模块中的Process类
1、创建子进程时只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动
2、子进程只运行实例化对象内的代码,主进程将子进程当做一段代码运行后继续向下运行,
用 join() 阻塞方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。
3、Process(target,args,kwargs) 语法结构:
target:表示这个进程实例化所调用的函数。 args:表示调用对象的位置参数元组。
4、Process类方法语法结构:
(1)创建一个子类继承Process,在子类里面写上 def run(self): 方法
(2)在主进程中实例化子类对象 p = MyNewProcess(形参)
(3)启动子进程 p.start()
(4)同样可以用join()阻塞方法来控制进程的同步运行
(5)p.is_alive()判断子进程是否还在执行,返回True或False
(6)p.terminate()不管任务是否完成,立即终止
三、进程池Pool
1、当需要创建很多个进程时就用到multiprocessing模块中的Pool类,初始化Pool时可以指定
最大进程数,如果池没有满,那么就会创建一个新的进程用来执行该请求,但如果池中已满就
会等待其他进程结束,才会创建新的进程来执行。
2、定义进程池: po = Pool(5) 子进程只运行函数类的代码
3、向进程池中添加进程:
(1)非堵塞式:po.apply_async(函数名,(形参,)) 添加完进程后立马执行,执行完一轮后如果还有
新进程添加后再立马执行。
(2)堵塞式:po.apply(函数名,(形参,))先把所有进程分配完后,在同一个进程池中的任务执行
完后,再执行下一个进程池.......
4、关闭进程池:po.close() 关闭后po不再接收新的进程
5、po.join()阻塞方法 等待po中所有子进程执行完成,来控制进程的同步运行。
6、po.terminate() 不管任务是否完成,立即终止。
四、进程间的通讯Queue
(一)、Process中: from multiprocessing import Queue
1、创建Queue(队列)对象:q = Queue(3)最多接收三条put消息,不写表示不限数量
2、添加消息:
(1) q.put("消息1") 最多添加3条消息超出后系统会等待
(2) q.put_nowait("消息4")当添加到第4条消息后会抛出异常
3、获取消息:
(1) q.get() 获取队列中的消息并移除,当q为空时会系统会一直等待
(2) q.get_nowait() 如果为空时会抛出异常
4、q.qsize() 返回当前队列包含的消息数量
5、q.empty() 如果队列为空返回True,反之返回False
6、q.full() 如果队列满了返回True,反之返回False
7、q 实例化完后往往是以值的形式传递到进程中的函数体中:
pw = Process(target = write , args = (q,))
8、一个Queue对象只能完成两个进程之间的通讯,当有多个进程之间需要进行通讯时,那么就需要创建多个Queue对象,取出值赋给变量后再添加到另外一个Queue对象
(二)、Pool中:from multiprocessing import Manager
1、创建Queue(队列)对象 q = Manager().Queue()
2、添加获取以及其他性能和Process中一样
网友评论