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切片知识解析
Mar 06 Python
分享python数据统计的一些小技巧
Jul 21 Python
python目录与文件名操作例子
Aug 28 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
Django数据结果集序列化并展示实现过程
Apr 22 Python
使用python创建生成动态链接库dll的方法
May 09 Python
python实现文法左递归的消除方法
May 22 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
详解MindSpore自定义模型损失函数
Jun 30 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 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
innerText 使用示例
2014/01/23 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
python实现京东秒杀功能
2018/07/30 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
学习python需要有编程基础吗
2020/06/02 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
客服工作职责
2013/12/11 职场文书
剪枝的学问教学反思
2014/02/07 职场文书
企业安全生产承诺书
2014/05/22 职场文书
市场营销策划方案
2014/06/11 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
不同意离婚代理词
2015/05/23 职场文书
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
解析redis hash应用场景和常用命令
2021/08/04 Redis
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技