Python使用multiprocessing实现一个最简单的分布式作业调度系统


Posted in Python onMarch 14, 2016

 mutilprocess像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多。

介绍

Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个机器的多个进程中,依靠网络通信。

想到这,就在想是不是可以使用此模块来实现一个简单的作业调度系统。

实现

Job

首先创建一个Job类,为了测试简单,只包含一个job id属性

job.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Job:
def __init__(self, job_id):
self.job_id = job_id

Master

Master用来派发作业和显示运行完成的作业信息

master.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Queue import Queue
from multiprocessing.managers import BaseManager
from job import Job

class Master:

def __init__(self):
# 派发出去的作业队列
self.dispatched_job_queue = Queue()
# 完成的作业队列
self.finished_job_queue = Queue()
def get_dispatched_job_queue(self):
return self.dispatched_job_queue
def get_finished_job_queue(self):
return self.finished_job_queue
def start(self):
# 把派发作业队列和完成作业队列注册到网络上
BaseManager.register('get_dispatched_job_queue', callable=self.get_dispatched_job_queue)
BaseManager.register('get_finished_job_queue', callable=self.get_finished_job_queue)
# 监听端口和启动服务
manager = BaseManager(address=('0.0.0.0', 8888), authkey='jobs')
manager.start()
# 使用上面注册的方法获取队列
dispatched_jobs = manager.get_dispatched_job_queue()
finished_jobs = manager.get_finished_job_queue()
# 这里一次派发10个作业,等到10个作业都运行完后,继续再派发10个作业
job_id = 0
while True:
for i in range(0, 10):
job_id = job_id + 1
job = Job(job_id)
print('Dispatch job: %s' % job.job_id)
dispatched_jobs.put(job)
while not dispatched_jobs.empty():
job = finished_jobs.get(60)
print('Finished Job: %s' % job.job_id)
manager.shutdown()
if __name__ == "__main__":
master = Master()
master.start()

Slave

Slave用来运行master派发的作业并将结果返回

slave.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
from Queue import Queue
from multiprocessing.managers import BaseManager
from job import Job

class Slave:

def __init__(self):
# 派发出去的作业队列
self.dispatched_job_queue = Queue()
# 完成的作业队列
self.finished_job_queue = Queue()

def start(self):

# 把派发作业队列和完成作业队列注册到网络上
BaseManager.register('get_dispatched_job_queue')
BaseManager.register('get_finished_job_queue')
# 连接master
server = '127.0.0.1'
print('Connect to server %s...' % server)
manager = BaseManager(address=(server, 8888), authkey='jobs')
manager.connect()
# 使用上面注册的方法获取队列
dispatched_jobs = manager.get_dispatched_job_queue()
finished_jobs = manager.get_finished_job_queue()
# 运行作业并返回结果,这里只是模拟作业运行,所以返回的是接收到的作业
while True:
job = dispatched_jobs.get(timeout=1)
print('Run job: %s ' % job.job_id)
time.sleep(1)
finished_jobs.put(job)
if __name__ == "__main__":
slave = Slave()
slave.start()

测试

分别打开三个linux终端,第一个终端运行master,第二个和第三个终端用了运行slave,运行结果如下

master

$ python master.py 
Dispatch job: 1
Dispatch job: 2
Dispatch job: 3
Dispatch job: 4
Dispatch job: 5
Dispatch job: 6
Dispatch job: 7
Dispatch job: 8
Dispatch job: 9
Dispatch job: 10
Finished Job: 1
Finished Job: 2
Finished Job: 3
Finished Job: 4
Finished Job: 5
Finished Job: 6
Finished Job: 7
Finished Job: 8
Finished Job: 9
Dispatch job: 11
Dispatch job: 12
Dispatch job: 13
Dispatch job: 14
Dispatch job: 15
Dispatch job: 16
Dispatch job: 17
Dispatch job: 18
Dispatch job: 19
Dispatch job: 20
Finished Job: 10
Finished Job: 11
Finished Job: 12
Finished Job: 13
Finished Job: 14
Finished Job: 15
Finished Job: 16
Finished Job: 17
Finished Job: 18
Dispatch job: 21
Dispatch job: 22
Dispatch job: 23
Dispatch job: 24
Dispatch job: 25
Dispatch job: 26
Dispatch job: 27
Dispatch job: 28
Dispatch job: 29
Dispatch job: 30

slave1

$ python slave.py 
Connect to server 127.0.0.1...
Run job: 1 
Run job: 2 
Run job: 3 
Run job: 5 
Run job: 7 
Run job: 9 
Run job: 11 
Run job: 13 
Run job: 15 
Run job: 17 
Run job: 19 
Run job: 21 
Run job: 23

slave2

$ python slave.py 
Connect to server 127.0.0.1...
Run job: 4 
Run job: 6 
Run job: 8 
Run job: 10 
Run job: 12 
Run job: 14 
Run job: 16 
Run job: 18 
Run job: 20 
Run job: 22 
Run job: 24

以上内容是小编给大家介绍的Python使用multiprocessing实现一个最简单的分布式作业调度系统,希望对大家有所帮助!

Python 相关文章推荐
python实现批量获取指定文件夹下的所有文件的厂商信息
Sep 28 Python
Python中操作文件之write()方法的使用教程
May 25 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
Python使用遗传算法解决最大流问题
Jan 29 Python
Python实现Kmeans聚类算法
Jun 10 Python
Python BS4库的安装与使用详解
Aug 08 Python
python使用matplotlib画饼状图
Sep 25 Python
Python基于Socket实现简单聊天室
Feb 17 Python
Python装饰器的应用场景代码总结
Apr 10 Python
Flask中sqlalchemy模块的实例用法
Aug 02 Python
Pandas之缺失数据的实现
Jan 06 Python
Python 的演示平台支持 WSGI 接口的应用
Apr 20 Python
简单讲解Python中的字符串与字符串的输入输出
Mar 13 #Python
深入解析Python中的list列表及其切片和迭代操作
Mar 13 #Python
Python中的列表生成式与生成器学习教程
Mar 13 #Python
jupyter安装小结
Mar 13 #Python
Ubuntu下安装PyV8
Mar 13 #Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
Mar 13 #Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 #Python
You might like
德生PL550的电路分析
2021/03/02 无线电
PHP 程序员的调试技术小结
2009/11/15 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
解读ES6中class关键字
2017/11/20 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
python数据归一化及三种方法详解
2019/08/06 Python
python 经典数字滤波实例
2019/12/16 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
电气自动化自荐信
2013/10/10 职场文书
大学生村官任职感言
2014/01/09 职场文书
教师年度考核个人总结
2015/02/12 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
深入理解Pytorch微调torchvision模型
2021/11/11 Python