python分布式计算dispy的使用详解


Posted in Python onDecember 22, 2019

dispy,是用asyncoro实现的分布式并行计算框架。

框架也是非常精简,只有4个组件,在其源码文件夹下可以找到:

dispy.py (client) provides two ways of creating “clusters”: JobCluster when only one instance of dispy may run and SharedJobCluster when multiple instances may run (in separate processes). If JobCluster is used, the scheduler contained within dispy.py will distribute jobs on the server nodes; if SharedJobCluster is used, a separate scheduler (dispyscheduler) must be running.

dispynode.py executes jobs on behalf of dispy. dispynode must be running on each of the (server) nodes that form the cluster.

dispyscheduler.py is needed only when SharedJobCluster is used; this provides a scheduler that can be shared by multiple dispy users.

dispynetrelay.py is needed when nodes are located across different networks; this relays information about nodes on a network to the scheduler. If all the nodes are on same network, there is no need for dispynetrelay - the scheduler and nodes automatically discover each other.

一般情况下,使用dispy和dispynode就已经足够解决问题了。

简单使用:

服务器端:

在服务器端启动dispy,监听并接收所有发来的计算任务,完成计算后将结果返回给客户端。

打开python_home/Scripts文件夹,在安装dispy后会有上面说到的4个dispy组件,以py文件形式存在。当然你也可以在dispy的源码文件夹里面找到对于的dispynode.py文件,然后执行

python dispynode.py -c 2 -i 192.168.138.128 -p 51348 -s secret --clean

python dispynode.py -c 2 -i 192.168.8.143 -p 51348 -s secret --clean

这里192.168.138.128和192.168.8.143是执行计算节点的ip(对服务器来说相当于localhost),这里我启用了两个节点,每个节点使用2个cpu资源,其中有一个节点是在虚拟机,一个是本地机器。

-s secret是通信密码,客户端和服务器连接需要密码,密码随意。

--clean表示每次启动服务都删除上次的启动信息,如果不删除,可能会出现pid占用的错误。

客户端:

在客户端需要注意的是,发送到计算节点函数所引用的模块,不能在py文件的顶层导入,而需要在函数内导入。

对于需要导入自定义模块,比较麻烦一点,需要先实例化函数,才能在计算节点的函数中使用。

# 这些在顶层导入的模块只能是这个py文件用
import time
import socket
import numpy
import datetime

# 这个是自定义函数,要在本模块中先实例化才能在计算节点函数中调用使用,
# 而本模块的其他地方可以直接调用使用
from my_package.my_model import get_time 

# 实例化自定义的函数,注意后面是没有括号的,否则就是直接调用得到返回值了
now = get_time.now

# 计算函数,dispy将这个函数和参数一并发送到服务器节点
# 如果函数有多个参数,需要包装程tuple格式
def compute(args):
 n,array=args # 如果函数有多个参数,需要包装程tuple格式
 # 看到没,计算需要的模块是在函数内导入的
 import time, socket
 time.sleep(3)
 host = socket.gethostname()
 # 这个py文件中自定义函数,可以直接引用
 total= my_sum(array)
 # 这个now是在其他模块中自定义的函数,需要在顶层先实例化才能引用
 now_time=now()
 return (host, n, total,now_time)

def sum(array):
 # 自定义函数,需要的模块同样需要在函数内导入
 import numpy as np
 return np.sum(array)

def loadData():
 # 自定义函数,生成测试数据
 import numpy as np
 data = np.random.rand(20,20)
 data = [line for line in data]
 return data



if __name__ == '__main__':
 import dispy, random
 # 定义两个计算节点
 nodes = ['192.168.8.143', '192.168.138.128']
 # 启动计算集群,和服务器通信,通信密钥是'secret'
 # depends 为依赖函数
 cluster = dispy.JobCluster(compute,nodes=nodes,
      secret='secret',depends=[sum,now])
 jobs = []

 datas = loadData()
 for n in range(len(datas)):
  # 提交任务
  job = cluster.submit((n,datas[n]))
  job.id = n
  jobs.append(job)
 # print(datetime.datetime.now())
 # cluster.wait() # 等待所有任务完成后才接着往下执行
 # print(datetime.datetime.now())
 for job in jobs:
  host, n, total,t = job()
  print('%s executed job %s at %s with %s total=%.2f t=%s' 
    % (host, job.id, job.start_time, n,total,t))
  # other fields of 'job' that may be useful:
  # print job.stdout, job.stderr, job.exception, 
  # job.ip_addr, job.start_time, job.end_time
 # 显示集群计算状态
 cluster.stats()

以上这篇python分布式计算dispy的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python模块之re正则表达式详解
Feb 03 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
Mar 22 Python
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
Python干货:分享Python绘制六种可视化图表
Aug 27 Python
python训练数据时打乱训练数据与标签的两种方法小结
Nov 08 Python
python 自动批量打开网页的示例
Feb 21 Python
使用Python的SymPy库解决数学运算问题的方法
Mar 27 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
详解pandas的外部数据导入与常用方法
May 01 Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
使用python实现哈希表、字典、集合操作
Dec 22 #Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 #Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 #Python
python使用正则来处理各种匹配问题
Dec 22 #Python
Python中base64与xml取值结合问题
Dec 22 #Python
python操作cfg配置文件方式
Dec 22 #Python
python实现局域网内实时通信代码
Dec 22 #Python
You might like
Zerg兵种介绍
2020/03/14 星际争霸
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
js判断日期时间有效性的方法
2015/10/24 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
原生js实现轮播图
2017/02/27 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
Vuex提升学习篇
2018/01/11 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
python字符串连接方法分析
2016/04/12 Python
python3处理含有中文的url方法
2018/05/10 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
行政人事岗位职责
2014/03/17 职场文书
医院标语大全
2014/06/23 职场文书
2015年副班长工作总结
2015/05/15 职场文书
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS