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中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
Python中的localtime()方法使用详解
May 22 Python
深入理解Django自定义信号(signals)
Oct 15 Python
Python 面试中 8 个必考问题
Nov 16 Python
Python中文件的写入读取以及附加文字方法
Jan 23 Python
Python 限定函数参数的类型及默认值方式
Dec 24 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
Python API len函数操作过程解析
Mar 05 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
Python生成器generator原理及用法解析
Jul 20 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 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/17 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
PHP运行模式汇总
2016/11/06 PHP
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
vue-element-admin 菜单标签失效的解决方式
2019/11/12 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
分析python切片原理和方法
2017/12/19 Python
python邮件发送smtplib使用详解
2020/06/16 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
Python高级property属性用法实例分析
2019/11/19 Python
python实现微信打飞机游戏
2020/03/24 Python
python redis存入字典序列化存储教程
2020/07/16 Python
捐款倡议书格式范文
2014/05/14 职场文书
商场促销活动策划方案
2014/08/18 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
仰望星空观后感
2015/06/10 职场文书
元宵节晚会主持词
2015/07/01 职场文书
导游词之神仙居景区
2019/11/15 职场文书
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
Android Rxjava3 使用场景详解
2022/04/07 Java/Android