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中基于生成器的状态机
Apr 13 Python
python numpy 部分排序 寻找最大的前几个数的方法
Jun 27 Python
Python多进程fork()函数详解
Feb 22 Python
Python中按键来获取指定的值
Mar 02 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
用django-allauth实现第三方登录的示例代码
Jun 24 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
python中pathlib模块的基本用法与总结
Aug 17 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
Aug 24 Python
如何通过python实现IOU计算代码实例
Nov 02 Python
OpenCV全景图像拼接的实现示例
Jun 05 Python
pd.DataFrame中的几种索引变换的实现
Jun 16 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
php4与php5的区别小结(配置异同)
2011/12/20 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
基于jquery的3d效果实现代码
2011/03/23 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
2018/06/07 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
[06:53]DOTA2每周TOP10 精彩击杀集锦vol.3
2014/06/25 DOTA
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
Python shutil模块用法实例分析
2019/10/02 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
教师读书活动总结
2014/05/07 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
 python中的元类metaclass详情
2022/05/30 Python
如何利用python实现Simhash算法
2022/06/28 Python