由于GIL的存在,python中的多线程其实并不是真正意义上的多线程,前面一篇文章Python中的多线程与多进程那些事 中提到I/O密集型使用多线程并发执行提高效率、计算密集型使用多进程并行执行提高效率。
针对计算密集型的任务,我们如何通过多进程提高效率?
Window下的multiprocessing分布式计算基于multiprocessing、queue等模块实现简易的分布式计算框架。服务节点负责任务的派发和任务结果的采集,工作节点分布在同一电脑的不同进程,或者其他电脑上,负责任务执行和结果反馈,服务节点与工作节点通过Queue实现数据共享(任务下发、结果反馈)。
其中包含Task、MaterWork、SlaveWork三个模块,大体介绍及源码如下:
Task模块根据任务需求,将自己的任务单独封装在task模块中。
MaterWork(主节点/服务节点)负责任务派发和结果采集,主从节点通过Queue实现任务、结果共享。代码中注释中已介绍的较清楚,这里不做赘述。
SlaveWork(从节点/计算节点)
使用说明3.1 在Task.py 添加任务函数。
3.2 调整主从节点任务派发具体函数、次数或参数。一般情况分发次数等于任务数,即分发任务的参数。
# 添加待处理任务,实际应用过程添加的任务可以为函数的参数
for i in range(0, 10):
task = Task(i).computer()
print 'Dispatch job: {0}'.format(i)
dispatched_jobs.put(task)
3.3 启动主节点
3.3 启动从节点
将从节点计算模块发送至不同电脑,启动从节点即实现分布式计算,即N个从节点消费服务节点分发任务,并返回任务执行状态、结果。
3.4 启动从节点后,可以在主节点运行界面,看到任务完成情况。
若对你有帮助,点赞支持一下。