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基础教程之python消息摘要算法使用示例
Feb 10 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
Linux下python3.7.0安装教程
Jul 30 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
python程序控制NAO机器人行走
Apr 29 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
django连接oracle时setting 配置方法
Aug 29 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
浅谈Python中threading join和setDaemon用法及区别说明
May 02 Python
Flask搭建一个API服务器的步骤
May 28 Python
Python机器学习之底层实现KNN
Jun 20 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
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
PHP缓存工具XCache安装与使用方法详解
2018/04/09 PHP
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
深入理解JavaScript系列(47):对象创建模式(上篇)
2015/03/04 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
js获取Get值的方法
2016/09/29 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
Tesserocr库的正确安装方式
2018/10/19 Python
美国旅游网站:Tours4Fun
2017/02/17 全球购物
英国现代绅士品牌:Hackett
2017/12/17 全球购物
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
美国校服网上商店:French Toast
2019/10/08 全球购物
文明学生事迹材料
2014/01/29 职场文书
小学生开学感言
2014/02/28 职场文书
公司踏青活动方案
2014/08/16 职场文书
银行竞聘上岗演讲稿
2014/09/12 职场文书
采购内勤岗位职责
2015/04/13 职场文书
朋友聚会开场白
2015/06/01 职场文书
简历自我评价范文
2019/04/24 职场文书
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python
Java内存模型之happens-before概念详解
2021/06/13 Java/Android