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数据处理实战(必看篇)
Jun 11 Python
如何使用VSCode愉快的写Python于调试配置步骤
Apr 06 Python
python使用zip将list转为json的方法
Dec 31 Python
python读取文件名并改名字的实例
Jan 07 Python
python实现支付宝转账接口
May 07 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 Python
使用Python和百度语音识别生成视频字幕的实现
Apr 09 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
python音频处理的示例详解
Dec 23 Python
Elasticsearch 索引操作和增删改查
Apr 19 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后门URL的防范
2013/11/12 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python中的pack和unpack的使用
2018/03/12 Python
Python对List中的元素排序的方法
2018/04/01 Python
Python字符串的常见操作实例小结
2019/04/08 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
简单了解python的一些位运算技巧
2019/07/13 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
主持人婚宴答谢词
2014/01/28 职场文书
自主招生自荐信指南
2014/02/04 职场文书
房地产开发项目建议书
2014/05/16 职场文书
初中政治教师教学反思
2016/02/23 职场文书
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫