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中的文件与目录操作
Jul 11 Python
python3大文件解压和基本操作
Dec 15 Python
详解Django之auth模块(用户认证)
Apr 17 Python
python购物车程序简单代码
Apr 18 Python
python 接收处理外带的参数方法
Dec 03 Python
浅谈tensorflow 中tf.concat()的使用
Feb 07 Python
使用Python 自动生成 Word 文档的教程
Feb 13 Python
基于Python脚本实现邮件报警功能
May 20 Python
python实现计算器简易版
Dec 17 Python
Python实现照片卡通化
Dec 06 Python
Python Pandas读取Excel日期数据的异常处理方法
Feb 28 Python
Python中的 No Module named ***问题及解决
Jul 23 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
Classes and Objects in PHP5-面向对象编程 [1]
2006/10/09 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
vue组件横向树实现代码
2018/08/02 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
layui的select联动实现代码
2019/09/28 Javascript
详解Python中的变量及其命名和打印
2016/03/11 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
python实现俄罗斯方块游戏
2020/03/25 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
python多线程下信号处理程序示例
2019/05/31 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
ddl,dml和dcl的含义
2016/05/08 面试题
JAVA中运算符的分类及举例
2015/09/12 面试题
医学护理系毕业生求职信
2013/10/01 职场文书
自我鉴定范文
2013/11/10 职场文书
对公司合理化的建议书
2014/03/12 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
一文搞懂python异常处理、模块与包
2021/06/26 Python
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers