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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
python基础教程之基本数据类型和变量声明介绍
Aug 29 Python
解决pycharm无法识别本地site-packages的问题
Oct 13 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
基于Django框架的权限组件rbac实例讲解
Aug 31 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
Feb 04 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 Python
Python与C/C++的相互调用案例
Mar 04 Python
python 实现的截屏工具
May 08 Python
用Python仅20行代码编写一个简单的端口扫描器
Apr 08 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 什么是PEAR?
2009/03/19 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
php实现微信支付之现金红包
2018/05/30 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
JavaScript Array扩展实现代码
2009/10/14 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
python实现换位加密算法的示例
2018/10/14 Python
python的debug实用工具 pdb详解
2019/07/12 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
英国在线自行车商店:Evans Cycles
2016/09/26 全球购物
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
后勤人员自我鉴定
2013/10/20 职场文书
员工晚婚的请假条
2014/02/08 职场文书
2014年公司庆元旦活动方案
2014/03/05 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
群众路线个人整改措施
2014/10/24 职场文书
2014年房产销售工作总结
2014/12/08 职场文书