“分布式计算”也是当今IT行业的一个非常火热的名词,大家都知道的谷歌机房,还有2013年诺贝尔物理学奖获奖项目“希格斯波色子”,都利用了“分布式计算”来分担一部分计算量从而提高计算效率,尤其在数据科学领域“分布式计算”起到举足轻重的作用。
ParallelPython简称pp,是一个基于Python的分布式计算框架,有很多朋友都会用到。
别的也不多说,回归主题,可能有很多像我一样的刚刚接触Python又独爱win10的菜鸟,在使用“pip install pp”安装pp时都会遇到各种安装错误导致无法安装。
可能在官网下载了wheel文件安装时也会遇到错误,比如下图:
那这下该怎么办呢?
不用担心,我们先进入pp的官方网站:https://www.parallelpython.com
进入后在上方找到“Downloads”:
然后找到“Windows installer”,这是一个pp的exe格式安装包,官网上有两个“Windows installer”,根据自己需要的版本进行下载。如下图:
笔者下载的是最新的pp-1.6.6.exe md5,下载后会得到如下文件:
现在打开刚刚下载的“pp-1.6.6.exe”,进入到以下安装界面:
点击“下一步”,这时我们进入到配置环境,pp安装时会自动扫描自己电脑里安装的Python环境,有很多朋友会像我一样同时安装了两个甚至多个版本的Python,此时我们只需要选择一个我们要使用的Python版本进行安装,在这里我选择的是Anaconda的Python3.6,至于“Python Directory”和“Installation Directory”的路径也是自动搜索到的,不用管它,然后点击“下一步”
(ps:在这里我强烈建议大家使用Anaconda,尤其是处理数据科学的朋友,Anaconda是一个非常棒的管理库的程序,安装时自带了基本所有要用到的库,也可以手动安装一些第三方库,更关键的是,有图形界面,不是黑框框!可以不用pip!像我这种懒蛋,点点鼠标就能安装很多第三方库!)
现在已经安装好了,但是这样就结束工作了吗?
等等!还没完!!!
当我们真的要使用pp时,可能会遇到这个问题:
原因很简单,是因为pp的版本out了。因为这个版本是2017年更新的,而我们用到的Python版本可能是新版,比如我使用的是Python3.6.5,而新版本的语法有些改变,print被改为了print()我们要手动进行更改,还有一些库的名称和内容也有更改,这里就不做过多赘述了。
首先进入到我们的Python所在的文件夹“Lib\site-packages”(Anaconda的用户为:Anaconda3\Lib\site-packages),找到“pp.py”,然后用编辑器将其打开,进行修改:
改为以下:
在第121行改为:print(sout),
第534行至第555行改为:
这里我附上代码:
print ("Job execution statistics:")
walltime = time.time() - self.__creation_time
statistics = self.get_stats().items()
totaljobs = 0.0
for ppserver, stat in statistics:
totaljobs += stat.njobs
print (" job count | % of all jobs | job time sum | " \
"time per job | job server")
for ppserver, stat in statistics:
if stat.njobs:
print( " %6i | %6.2f | %8.4f | %11.6f | %s" \
% (stat.njobs, 100.0*stat.njobs/totaljobs, stat.time,
stat.time/stat.njobs, ppserver, ))
print( "Time elapsed since server creation", walltime)
print (self.__active_tasks, "active tasks,", self.get_ncpus(), "cores")
if not self.__accurate_stats:
print( "WARNING: statistics provided above is not accurate" \
" due to job rescheduling")
print
同时把开头的导入部分改为:
import os
import threading
import logging
import inspect
import sys
import types
import time
import atexit
import pickle
import pptransport
import ppauto
import ppcommon
然后在与“pp.py”相同的根目录“site-packages”文件夹里找到“pptransport.py”,用编辑器打开,把第171至第187行改为:
def send(self, data):
size = struct.pack("!Q", len(data))
t_size = struct.calcsize("!Q")
s_size = 0
while s_size < t_size:
p_size = self.socket.send(size[s_size:])
if p_size == 0:
raise RuntimeError("Socket connection is broken")
s_size += p_size
t_size = len(data)
s_size = 0
while s_size < t_size:
p_size = self.socket.send(data[s_size:])
if p_size == 0:
raise RuntimeError("Socket connection is broken")
s_size += p_size
如果在使用过程中出现了问题,可以与ParallelPython官方进行联系,链接:
https://www.parallelpython.com/component/option,com_contact/Itemid,3/
感谢您的耐心阅读与支持^_^
作者:Nick.ZLS(超可爱的小松松)
猎户座分析团队菜鸟级量化分析师