创建自己的进程类
from multiprocessing import Process
from time import sleep,ctime
class Clockprocess(Process):
def __init__(self,value):
self.value = value
Process.__init__(self)
def run(self):
for _ in range(5):
sleep(self.value)
print(ctime())
p = Clockprocess(1)
p.start()
p.join()
print('Over!')
--------------
多进程
优点: 并行多个任务,提高运行效率,空间独立,数据安全,创建方便
缺点: 进程创建晓辉的过程中消耗较多的计算机资源
进程池:
在需要频繁地创建销毁进程资源的情况下,使用进程池技术;
1, 创建进程池,在池内放入适量的进程
2, 将事件加入进程池等待队列
3, 使用进程池中的进程不断处理事件
4, 所有事件处理后,回收关闭进程池
from multiprocessing import Pool
Pool(processes)
功能: 创建进程池
参数: processes: 进程池中进程数量
返回: 得到进程池对象
pool.apply_async()
功能: 异步方式将事件放入进程池执行
参数: func 要执行的事件函数
args: 同process中的args,给函数传参
kwds: 以字典方式给函数传参
close() 关闭进程池,使其无法加入新的事件
pool.join() 阻塞等待进程池退出,(当所有时间处理完毕后)
每个进程可以获取其返回值,通过return获取返回值对象r
r.get() 可以获取返回值对象的返回值
apply()函数 用法和apply_async()功能相似,只是需要顺序执行,一个事件结束再执行另一个事件
pool.map(func, iter) 功能同高阶函数map() ,逐个将iter中的参数迭代使用func函数执行,但是会以进程池的数量同步执行(兼容进程池功能)
from multiprocessing import Pool
from time import sleep,ctime
import os
def worker(msg):
print(msg)
sleep(3)
return msg + 'Over!'
#创建进程池对象
p = Pool(processes = 4)
#将事件放入,并执行
result = []
for I in range(10):
msg = '打第{}场游戏.'.format(I)
#加入事件后,进程会立即运行
r = p.apply_async(worker, (msg,))
result.append(r)
sleep(3)
print('------------------')
#关闭进程池
p.close()
sleep(3)
print('-**************')
#回收进程池
p.join()
print('+++++++++++++')
for I in result:
print(I.get())