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使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
介绍Python的@property装饰器的用法
Apr 28 Python
python排序方法实例分析
Apr 30 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
python技能之数据导出excel的实例代码
Aug 11 Python
python实现超简单的视频对象提取功能
Jun 04 Python
Python3实现转换Image图片格式
Jun 21 Python
Python获取Redis所有Key以及内容的方法
Feb 19 Python
python离线安装外部依赖包的实现
Feb 13 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 Python
python实现代码审查自动回复消息
Feb 01 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
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
原生js调用json方法总结
2018/02/22 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
js实现轮播图特效
2020/05/28 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
python中__slots__用法实例
2015/06/04 Python
Python测试线程应用程序过程解析
2019/12/31 Python
python判断两个序列的成员是否一样的实例代码
2020/03/01 Python
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
金融专业个人的自我评价
2013/10/18 职场文书
庆中秋节主题活动方案
2014/02/03 职场文书
英语教师岗位职责
2014/03/16 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
信用卡工资证明范本
2015/06/19 职场文书
学雷锋活动简报
2015/07/20 职场文书
养成教育工作总结
2015/08/13 职场文书
mysql 获取时间方式
2022/03/20 MySQL
Hive导入csv文件示例
2022/06/25 数据库