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 相关文章推荐
python3简单实现微信爬虫
Apr 09 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
人脸识别经典算法一 特征脸方法(Eigenface)
Mar 13 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
Mar 05 Python
Python 实现大整数乘法算法的示例代码
Sep 17 Python
关于Python中定制类的比较运算实例
Dec 19 Python
python生成任意频率正弦波方式
Feb 25 Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 Python
python中rc1什么意思
Jun 19 Python
Python根据指定文件生成XML的方法
Jun 29 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
Look And Say 序列php实现代码
2011/05/22 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
php中error与exception的区别及应用
2014/07/28 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
如何用Python绘制3D柱形图
2020/09/16 Python
Python的logging模块基本用法
2020/12/24 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
中专毕业生求职简历的自我评价
2013/10/21 职场文书
建筑设计师岗位职责
2013/11/18 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
庆中秋节主题活动方案
2014/02/03 职场文书
音乐教学随笔感言
2014/02/19 职场文书
初中学生期末评语
2014/04/24 职场文书
四风问题查摆材料
2014/08/25 职场文书
创业计划书之酒厂
2019/10/14 职场文书
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python