python分布式计算dispy的使用详解
作者:振裕 发布时间:2021-01-14 09:15:24
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()
来源:https://blog.csdn.net/suzyu12345/article/details/53909688


猜你喜欢
- 主要是:前序遍历、中序遍历、后序遍历、层级遍历、非递归前序遍历、非递归中序遍历、非递归后序遍历#!/usr/bin/env python#-
- 在Goland中,如果 import 了包,但在代码中没有使用,会自动帮你移除这个包的 引用有可能是习惯问题,每次写代码都习惯 先impor
- 本教程为大家分享了oracle 11g r2安装教程,供大家参考,具体内容如下一、环境脚本简单配置#!/bin/bashmv /etc/yu
- asp之家注:对于ACCESS数据库中的NULL,经常我们直接判断该字段是否为空用的是:name="",但是这个还不够,
- 最近一直在研究 Javascript 相关的技术。在《Javascript 高级程序设计》有篇章节着重阐述了优
- from sgmllib import SGMLParserimport urllib2class sgm(SGMLParser):&nbs
- 函数: # 什么是函数:一系列python语句的组合,可以在程序中运行一次或者多次# 一般是完成具体的独立的功能# 为什么要使用函数# 代码
- 前言Cookie和Session相信对大家来说并不陌生,简单来说,Cookie和Session都是为了记录用户相关信息的方式,最大的区别就是
- 您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ?我们先抛开 g
- 前言关于 var、let 和 const 三个关键字的区别,是一个老生常谈的问题,也是经典的面试题。本篇文章将全面讲解三者的特性,以及它们之
- 1、代码如下:import numpy as npfrom keras.models import Sequentialfrom keras
- 一、硬件要求首先,TensorFlow-gpu不同于CPU版本的地方在于,GPU版本必须有GPU硬件的支撑。TensorFlow对NVIDI
- 本文实例为大家分享了python定时发送邮件的具体代码,供大家参考,具体内容如下全部代码如下:import timefrom datetim
- 当我们进行数据分析时,有时候需要对数值型数据进行离散化,将其划分为不同的标签或类别。这样做可以方便我们进行统计和分析,并帮助我们更好地理解数
- 像素误差看自己设计好上线的网站,偶尔会发觉像素行间出现了弹性空间,总在不经意间蹦出一定的差距。有些页面很难发现,比如活动类页面,这类页面多呈
- 这篇文章主要介绍了python 采用paramiko 远程执行命令及报错解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- jQuery源码里自己也有很多用到each方法。其实jQuery里的each方法是通过js里的call方法来实现的。下面简单介绍一下call
- opencv 进行任意形状目标识别,供大家参考,具体内容如下工作中有一次需要在简单的图上进行目标识别,目标的形状不固定,并且存在一定程度上的
- 实现代码一、#!/usr/bin/pythonx,y=9,9 &nbs
- 处理数据时我们经常需要从数组中随机抽取元素,这时候我们可以考虑使用np.random.choice()函数语法格式numpy.random.